diff --git a/ipc/unixsocket/SocketBase.h b/ipc/unixsocket/SocketBase.h index 4899d785374e..abb7f5a4fd22 100644 --- a/ipc/unixsocket/SocketBase.h +++ b/ipc/unixsocket/SocketBase.h @@ -459,6 +459,35 @@ private: T* mIO; }; +/* |SocketIOSendTask| transfers an instance of |UnixSocketRawData| to + * the I/O thread and queues it up for sending the contained data. + */ +template +class SocketIOSendTask MOZ_FINAL : public SocketIOTask +{ +public: + SocketIOSendTask(T* aIO, UnixSocketRawData* aData) + : SocketIOTask(aIO) + , mData(aData) + { + MOZ_ASSERT(aData); + } + + void Run() MOZ_OVERRIDE + { + MOZ_ASSERT(!NS_IsMainThread()); + MOZ_ASSERT(!SocketIOTask::IsCanceled()); + + T* io = SocketIOTask::GetIO(); + MOZ_ASSERT(!io->IsShutdownOnIOThread()); + + io->Send(mData); + } + +private: + UnixSocketRawData* mData; +}; + } } diff --git a/ipc/unixsocket/UnixSocket.cpp b/ipc/unixsocket/UnixSocket.cpp index 0dacae8330d1..02a118f39928 100644 --- a/ipc/unixsocket/UnixSocket.cpp +++ b/ipc/unixsocket/UnixSocket.cpp @@ -8,6 +8,7 @@ #include "nsTArray.h" #include "nsXULAppAPI.h" #include +#include "mozilla/unused.h" static const size_t MAX_READ_SIZE = 1 << 16; @@ -173,34 +174,6 @@ private: CancelableTask* mDelayedConnectTask; }; -class SocketSendTask : public SocketIOTask -{ -public: - SocketSendTask(UnixSocketImpl* aImpl, - UnixSocketConsumer* aConsumer, - UnixSocketRawData* aData) - : SocketIOTask(aImpl) - , mConsumer(aConsumer) - , mData(aData) - { - MOZ_ASSERT(aConsumer); - MOZ_ASSERT(aData); - } - void Run() MOZ_OVERRIDE - { - MOZ_ASSERT(!NS_IsMainThread()); - MOZ_ASSERT(!IsCanceled()); - - UnixSocketImpl* impl = GetIO(); - MOZ_ASSERT(!impl->IsShutdownOnIOThread()); - - impl->Send(mData); - } -private: - nsRefPtr mConsumer; - UnixSocketRawData* mData; -}; - class SocketListenTask : public SocketIOTask { public: @@ -538,27 +511,28 @@ UnixSocketConsumer::SendSocketData(UnixSocketRawData* aData) } MOZ_ASSERT(!mImpl->IsShutdownOnMainThread()); - XRE_GetIOMessageLoop()->PostTask(FROM_HERE, - new SocketSendTask(mImpl, this, aData)); + XRE_GetIOMessageLoop()->PostTask( + FROM_HERE, new SocketIOSendTask(mImpl, aData)); + return true; } bool UnixSocketConsumer::SendSocketData(const nsACString& aStr) { - MOZ_ASSERT(NS_IsMainThread()); - if (!mImpl) { - return false; - } if (aStr.Length() > MAX_READ_SIZE) { return false; } - MOZ_ASSERT(!mImpl->IsShutdownOnMainThread()); - UnixSocketRawData* d = new UnixSocketRawData(aStr.BeginReading(), - aStr.Length()); - XRE_GetIOMessageLoop()->PostTask(FROM_HERE, - new SocketSendTask(mImpl, this, d)); + nsAutoPtr data( + new UnixSocketRawData(aStr.BeginReading(), aStr.Length())); + + if (!SendSocketData(data)) { + return false; + } + + unused << data.forget(); + return true; }