From 16395142c1bd6b2203fa67585ec52316f8156aaa Mon Sep 17 00:00:00 2001 From: "jcampan@chromium.org" Date: Tue, 28 Jul 2009 22:09:45 +0000 Subject: The messages attached to the task created by an IPC ChannelProxy are leaked when the message loop is destroyed (the MessageLoop deletes its pending tasks on destruction, but not the messages). BUG=17091 TEST=Run the ui_tests with Purify. We should not be leaking messages. Review URL: http://codereview.chromium.org/159366 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21900 0039d316-1c4b-4281-b951-d872f2087c98 --- ipc/ipc_channel_proxy.cc | 28 +++++++++++++++++++++++++--- ipc/ipc_channel_proxy.h | 5 +++++ 2 files changed, 30 insertions(+), 3 deletions(-) (limited to 'ipc') diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc index eba506d..cbe8cc2 100644 --- a/ipc/ipc_channel_proxy.cc +++ b/ipc/ipc_channel_proxy.cc @@ -10,7 +10,29 @@ namespace IPC { -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ + +// This task ensures the message is deleted if the task is deleted without +// having been run. +class SendTask : public Task { + public: + SendTask(ChannelProxy::Context* context, Message* message) + : context_(context), + message_(message) { + } + + virtual void Run() { + context_->OnSendMessage(message_.release()); + } + + private: + scoped_refptr context_; + scoped_ptr message_; + + DISALLOW_COPY_AND_ASSIGN(SendTask); +}; + +//------------------------------------------------------------------------------ ChannelProxy::Context::Context(Channel::Listener* listener, MessageFilter* filter, @@ -254,8 +276,8 @@ bool ChannelProxy::Send(Message* message) { Logging::current()->OnSendMessage(message, context_->channel_id()); #endif - context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod( - context_.get(), &Context::OnSendMessage, message)); + context_->ipc_message_loop()->PostTask(FROM_HERE, + new SendTask(context_.get(), message)); return true; } diff --git a/ipc/ipc_channel_proxy.h b/ipc/ipc_channel_proxy.h index 77ddd87..e884818 100644 --- a/ipc/ipc_channel_proxy.h +++ b/ipc/ipc_channel_proxy.h @@ -14,6 +14,8 @@ class MessageLoop; namespace IPC { +class SendTask; + //----------------------------------------------------------------------------- // IPC::ChannelProxy // @@ -174,6 +176,7 @@ class ChannelProxy : public Message::Sender { private: friend class ChannelProxy; + friend class SendTask; // Create the Channel void CreateChannel(const std::string& id, const Channel::Mode& mode); @@ -199,6 +202,8 @@ class ChannelProxy : public Message::Sender { Context* context() { return context_; } private: + friend class SendTask; + void Init(const std::string& channel_id, Channel::Mode mode, MessageLoop* ipc_thread_loop, bool create_pipe_now); -- cgit v1.1