Bug 1046109: Add |SocketIOSendTask|, r=kyle

|SocketIOSendTask| moves data from the main thread to the Socket I/O
class on the I/O thread, and invokes the Socket I/O classes sending
methods.
This commit is contained in:
Thomas Zimmermann
2014-07-31 13:55:30 +02:00
parent 872a7ff22f
commit 3b4ab50988
2 changed files with 42 additions and 39 deletions

View File

@@ -459,6 +459,35 @@ private:
T* mIO; T* mIO;
}; };
/* |SocketIOSendTask| transfers an instance of |UnixSocketRawData| to
* the I/O thread and queues it up for sending the contained data.
*/
template <typename T>
class SocketIOSendTask MOZ_FINAL : public SocketIOTask<T>
{
public:
SocketIOSendTask(T* aIO, UnixSocketRawData* aData)
: SocketIOTask<T>(aIO)
, mData(aData)
{
MOZ_ASSERT(aData);
}
void Run() MOZ_OVERRIDE
{
MOZ_ASSERT(!NS_IsMainThread());
MOZ_ASSERT(!SocketIOTask<T>::IsCanceled());
T* io = SocketIOTask<T>::GetIO();
MOZ_ASSERT(!io->IsShutdownOnIOThread());
io->Send(mData);
}
private:
UnixSocketRawData* mData;
};
} }
} }

View File

@@ -8,6 +8,7 @@
#include "nsTArray.h" #include "nsTArray.h"
#include "nsXULAppAPI.h" #include "nsXULAppAPI.h"
#include <fcntl.h> #include <fcntl.h>
#include "mozilla/unused.h"
static const size_t MAX_READ_SIZE = 1 << 16; static const size_t MAX_READ_SIZE = 1 << 16;
@@ -173,34 +174,6 @@ private:
CancelableTask* mDelayedConnectTask; CancelableTask* mDelayedConnectTask;
}; };
class SocketSendTask : public SocketIOTask<UnixSocketImpl>
{
public:
SocketSendTask(UnixSocketImpl* aImpl,
UnixSocketConsumer* aConsumer,
UnixSocketRawData* aData)
: SocketIOTask<UnixSocketImpl>(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<UnixSocketConsumer> mConsumer;
UnixSocketRawData* mData;
};
class SocketListenTask : public SocketIOTask<UnixSocketImpl> class SocketListenTask : public SocketIOTask<UnixSocketImpl>
{ {
public: public:
@@ -538,27 +511,28 @@ UnixSocketConsumer::SendSocketData(UnixSocketRawData* aData)
} }
MOZ_ASSERT(!mImpl->IsShutdownOnMainThread()); MOZ_ASSERT(!mImpl->IsShutdownOnMainThread());
XRE_GetIOMessageLoop()->PostTask(FROM_HERE, XRE_GetIOMessageLoop()->PostTask(
new SocketSendTask(mImpl, this, aData)); FROM_HERE, new SocketIOSendTask<UnixSocketImpl>(mImpl, aData));
return true; return true;
} }
bool bool
UnixSocketConsumer::SendSocketData(const nsACString& aStr) UnixSocketConsumer::SendSocketData(const nsACString& aStr)
{ {
MOZ_ASSERT(NS_IsMainThread());
if (!mImpl) {
return false;
}
if (aStr.Length() > MAX_READ_SIZE) { if (aStr.Length() > MAX_READ_SIZE) {
return false; return false;
} }
MOZ_ASSERT(!mImpl->IsShutdownOnMainThread()); nsAutoPtr<UnixSocketRawData> data(
UnixSocketRawData* d = new UnixSocketRawData(aStr.BeginReading(), new UnixSocketRawData(aStr.BeginReading(), aStr.Length()));
aStr.Length());
XRE_GetIOMessageLoop()->PostTask(FROM_HERE, if (!SendSocketData(data)) {
new SocketSendTask(mImpl, this, d)); return false;
}
unused << data.forget();
return true; return true;
} }