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

@@ -8,6 +8,7 @@
#include "nsTArray.h"
#include "nsXULAppAPI.h"
#include <fcntl.h>
#include "mozilla/unused.h"
static const size_t MAX_READ_SIZE = 1 << 16;
@@ -173,34 +174,6 @@ private:
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>
{
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<UnixSocketImpl>(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<UnixSocketRawData> data(
new UnixSocketRawData(aStr.BeginReading(), aStr.Length()));
if (!SendSocketData(data)) {
return false;
}
unused << data.forget();
return true;
}