diff options
author | ronghuawu@google.com <ronghuawu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 05:19:08 +0000 |
---|---|---|
committer | ronghuawu@google.com <ronghuawu@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-19 05:19:08 +0000 |
commit | 99a9048ec7a7cfa1dad89f734d359f381ab6fb94 (patch) | |
tree | 6e24ea83019c90bf817e50ca311a598222321f88 /content | |
parent | a9ad61c843a8b2e4d22df9178efa3d9f31dbbd42 (diff) | |
download | chromium_src-99a9048ec7a7cfa1dad89f734d359f381ab6fb94.zip chromium_src-99a9048ec7a7cfa1dad89f734d359f381ab6fb94.tar.gz chromium_src-99a9048ec7a7cfa1dad89f734d359f381ab6fb94.tar.bz2 |
The P2PSocketDispatcher can be called from a non-render thread.
Override the RenderViewObserver::Send in P2PSocketDispatcher and post the call to the P2PSocketDispatcher's message_loop_, which is the render thread.
BUGS=none
TEST=none
Review URL: http://codereview.chromium.org/8253004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106212 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/p2p/socket_dispatcher.cc | 42 | ||||
-rw-r--r-- | content/renderer/p2p/socket_dispatcher.h | 3 |
2 files changed, 41 insertions, 4 deletions
diff --git a/content/renderer/p2p/socket_dispatcher.cc b/content/renderer/p2p/socket_dispatcher.cc index ddfcc27..15a5e65 100644 --- a/content/renderer/p2p/socket_dispatcher.cc +++ b/content/renderer/p2p/socket_dispatcher.cc @@ -4,6 +4,8 @@ #include "content/renderer/p2p/socket_dispatcher.h" +#include "base/bind.h" +#include "base/memory/ref_counted.h" #include "base/message_loop_proxy.h" #include "content/common/p2p_messages.h" #include "content/renderer/p2p/host_address_request.h" @@ -12,12 +14,44 @@ namespace content { +class P2PSocketDispatcher::AsyncMessageSender + : public base::RefCountedThreadSafe<AsyncMessageSender> { + public: + explicit AsyncMessageSender(IPC::Message::Sender* message_sender) + : message_loop_(base::MessageLoopProxy::current()), + message_sender_(message_sender) { + } + + void Detach() { + DCHECK(message_loop_->BelongsToCurrentThread()); + message_sender_ = NULL; + } + + void Send(IPC::Message* msg) { + message_loop_->PostTask(FROM_HERE, + base::Bind(&AsyncMessageSender::DoSend, this, msg)); + } + + private: + void DoSend(IPC::Message* msg) { + DCHECK(message_loop_->BelongsToCurrentThread()); + if (message_sender_) + message_sender_->Send(msg); + } + + scoped_refptr<base::MessageLoopProxy> message_loop_; + IPC::Message::Sender* message_sender_; + + DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender); +}; + P2PSocketDispatcher::P2PSocketDispatcher(RenderViewImpl* render_view) : content::RenderViewObserver(render_view), message_loop_(base::MessageLoopProxy::current()), network_notifications_started_(false), network_list_observers_( - new ObserverListThreadSafe<NetworkListObserver>()) { + new ObserverListThreadSafe<NetworkListObserver>()), + async_message_sender_(new AsyncMessageSender(this)) { } P2PSocketDispatcher::~P2PSocketDispatcher() { @@ -27,20 +61,20 @@ P2PSocketDispatcher::~P2PSocketDispatcher() { i.Advance()) { i.GetCurrentValue()->Detach(); } + async_message_sender_->Detach(); } void P2PSocketDispatcher::AddNetworkListObserver( NetworkListObserver* network_list_observer) { network_list_observers_->AddObserver(network_list_observer); network_notifications_started_ = true; - Send(new P2PHostMsg_StartNetworkNotifications(routing_id())); + async_message_sender_->Send( + new P2PHostMsg_StartNetworkNotifications(routing_id())); } void P2PSocketDispatcher::RemoveNetworkListObserver( NetworkListObserver* network_list_observer) { network_list_observers_->RemoveObserver(network_list_observer); - network_notifications_started_ = false; - Send(new P2PHostMsg_StopNetworkNotifications(routing_id())); } bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) { diff --git a/content/renderer/p2p/socket_dispatcher.h b/content/renderer/p2p/socket_dispatcher.h index e4f201f..b853e20 100644 --- a/content/renderer/p2p/socket_dispatcher.h +++ b/content/renderer/p2p/socket_dispatcher.h @@ -81,6 +81,7 @@ class P2PSocketDispatcher : public content::RenderViewObserver { private: friend class P2PHostAddressRequest; friend class P2PSocketClient; + class AsyncMessageSender; base::MessageLoopProxy* message_loop(); @@ -114,6 +115,8 @@ class P2PSocketDispatcher : public content::RenderViewObserver { scoped_refptr<ObserverListThreadSafe<NetworkListObserver> > network_list_observers_; + scoped_refptr<AsyncMessageSender> async_message_sender_; + DISALLOW_COPY_AND_ASSIGN(P2PSocketDispatcher); }; |