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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user