Index: ipc/ipc_channel_proxy.cc |
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc |
index fb365d61ac122e9d071bbe40bcb8a642f0873e25..f542eae2b0e59403560c4709afaf96f19ff8c6bf 100644 |
--- a/ipc/ipc_channel_proxy.cc |
+++ b/ipc/ipc_channel_proxy.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "base/bind.h" |
+#include "base/compiler_specific.h" |
#include "base/location.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
@@ -12,18 +13,17 @@ |
namespace IPC { |
-//------------------------------------------------------------------------------ |
- |
-// This task ensures the message is deleted if the task is deleted without |
+// This helper ensures the message is deleted if the task is deleted without |
// having been run. |
-class SendTask : public Task { |
+class SendCallbackHelper |
+ : public base::RefCountedThreadSafe<SendCallbackHelper> { |
public: |
- SendTask(ChannelProxy::Context* context, Message* message) |
+ SendCallbackHelper(ChannelProxy::Context* context, Message* message) |
: context_(context), |
message_(message) { |
} |
- virtual void Run() { |
+ void Send() { |
context_->OnSendMessage(message_.release()); |
} |
@@ -31,7 +31,7 @@ class SendTask : public Task { |
scoped_refptr<ChannelProxy::Context> context_; |
scoped_ptr<Message> message_; |
- DISALLOW_COPY_AND_ASSIGN(SendTask); |
+ DISALLOW_COPY_AND_ASSIGN(SendCallbackHelper); |
}; |
//------------------------------------------------------------------------------ |
@@ -354,8 +354,10 @@ bool ChannelProxy::Send(Message* message) { |
Logging::GetInstance()->OnSendMessage(message, context_->channel_id()); |
#endif |
- context_->ipc_message_loop()->PostTask(FROM_HERE, |
- new SendTask(context_.get(), message)); |
+ context_->ipc_message_loop()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&SendCallbackHelper::Send, |
+ new SendCallbackHelper(context_.get(), message))); |
return true; |
} |