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