diff options
author | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-13 22:04:00 +0000 |
---|---|---|
committer | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-13 22:04:00 +0000 |
commit | 3876da00af4660fdd8daf59c076b7676316b2d02 (patch) | |
tree | f58b169f98611f8924c9df182f71292b26c7dacd | |
parent | acc4eb8c1e9474ee6e72bedbc5f2b8a32c76036f (diff) | |
download | chromium_src-3876da00af4660fdd8daf59c076b7676316b2d02.zip chromium_src-3876da00af4660fdd8daf59c076b7676316b2d02.tar.gz chromium_src-3876da00af4660fdd8daf59c076b7676316b2d02.tar.bz2 |
Remove obsolete layer of indirection in gpu msg routing.
With the new base::Bind() support for weak pointers and IgnoreResults(),
the code that routes IPC messages from the GPU process to the correct
thread in the render process can be simplified a bit.
Review URL: http://codereview.chromium.org/9168001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117707 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/renderer/gpu/gpu_channel_host.cc | 41 | ||||
-rw-r--r-- | content/renderer/gpu/gpu_channel_host.h | 31 |
2 files changed, 24 insertions, 48 deletions
diff --git a/content/renderer/gpu/gpu_channel_host.cc b/content/renderer/gpu/gpu_channel_host.cc index 6e3038c..5bedc69 100644 --- a/content/renderer/gpu/gpu_channel_host.cc +++ b/content/renderer/gpu/gpu_channel_host.cc @@ -18,26 +18,10 @@ using base::AutoLock; using base::MessageLoopProxy; -GpuChannelHost::Listener::Listener( - base::WeakPtr<IPC::Channel::Listener> listener, - scoped_refptr<base::MessageLoopProxy> loop) - : listener_(listener), - loop_(loop) { - -} - -GpuChannelHost::Listener::~Listener() { - -} - -void GpuChannelHost::Listener::DispatchMessage(const IPC::Message& msg) { - if (listener_.get()) - listener_->OnMessageReceived(msg); +GpuListenerInfo::GpuListenerInfo() { } -void GpuChannelHost::Listener::DispatchError() { - if (listener_.get()) - listener_->OnChannelError(); +GpuListenerInfo::~GpuListenerInfo() { } GpuChannelHost::MessageFilter::MessageFilter(GpuChannelHost* parent) @@ -54,7 +38,10 @@ void GpuChannelHost::MessageFilter::AddRoute( scoped_refptr<MessageLoopProxy> loop) { DCHECK(MessageLoop::current() == ChildProcess::current()->io_message_loop()); DCHECK(listeners_.find(route_id) == listeners_.end()); - listeners_[route_id] = new GpuChannelHost::Listener(listener, loop); + GpuListenerInfo info; + info.listener = listener; + info.loop = loop; + listeners_[route_id] = info; } void GpuChannelHost::MessageFilter::RemoveRoute(int route_id) { @@ -76,11 +63,13 @@ bool GpuChannelHost::MessageFilter::OnMessageReceived( ListenerMap::iterator it = listeners_.find(message.routing_id()); if (it != listeners_.end()) { - const scoped_refptr<GpuChannelHost::Listener>& listener = it->second; - listener->loop()->PostTask( + const GpuListenerInfo& info = it->second; + info.loop->PostTask( FROM_HERE, - base::Bind(&GpuChannelHost::Listener::DispatchMessage, listener.get(), - message)); + base::Bind( + base::IgnoreResult(&IPC::Channel::Listener::OnMessageReceived), + info.listener, + message)); } return true; @@ -93,10 +82,10 @@ void GpuChannelHost::MessageFilter::OnChannelError() { for (ListenerMap::iterator it = listeners_.begin(); it != listeners_.end(); it++) { - const scoped_refptr<GpuChannelHost::Listener>& listener = it->second; - listener->loop()->PostTask( + const GpuListenerInfo& info = it->second; + info.loop->PostTask( FROM_HERE, - base::Bind(&GpuChannelHost::Listener::DispatchError, listener.get())); + base::Bind(&IPC::Channel::Listener::OnChannelError, info.listener)); } listeners_.clear(); diff --git a/content/renderer/gpu/gpu_channel_host.h b/content/renderer/gpu/gpu_channel_host.h index 7bdad49..c69e6b7 100644 --- a/content/renderer/gpu/gpu_channel_host.h +++ b/content/renderer/gpu/gpu_channel_host.h @@ -37,6 +37,14 @@ namespace IPC { class SyncMessageFilter; } +struct GpuListenerInfo { + GpuListenerInfo(); + ~GpuListenerInfo(); + + base::WeakPtr<IPC::Channel::Listener> listener; + scoped_refptr<base::MessageLoopProxy> loop; +}; + // Encapsulates an IPC channel between the renderer and one plugin process. // On the plugin side there's a corresponding GpuChannel. class GpuChannelHost : public IPC::Message::Sender, @@ -121,26 +129,6 @@ class GpuChannelHost : public IPC::Message::Sender, void ForciblyCloseChannel(); private: - // An shim class for working with listeners between threads. - // It is used to post a task to the thread that owns the listener, - // and where it's safe to dereference the weak pointer. - class Listener : - public base::RefCountedThreadSafe<Listener> { - public: - Listener(base::WeakPtr<IPC::Channel::Listener> listener, - scoped_refptr<base::MessageLoopProxy> loop); - virtual ~Listener(); - - void DispatchMessage(const IPC::Message& msg); - void DispatchError(); - - scoped_refptr<base::MessageLoopProxy> loop() { return loop_; } - - private: - base::WeakPtr<IPC::Channel::Listener> listener_; - scoped_refptr<base::MessageLoopProxy> loop_; - }; - // A filter used internally to route incoming messages from the IO thread // to the correct message loop. class MessageFilter : public IPC::ChannelProxy::MessageFilter { @@ -160,8 +148,7 @@ class GpuChannelHost : public IPC::Message::Sender, private: GpuChannelHost* parent_; - typedef base::hash_map<int, - scoped_refptr<GpuChannelHost::Listener> > ListenerMap; + typedef base::hash_map<int, GpuListenerInfo> ListenerMap; ListenerMap listeners_; }; |