summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorronghuawu@google.com <ronghuawu@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 05:19:08 +0000
committerronghuawu@google.com <ronghuawu@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-19 05:19:08 +0000
commit99a9048ec7a7cfa1dad89f734d359f381ab6fb94 (patch)
tree6e24ea83019c90bf817e50ca311a598222321f88 /content
parenta9ad61c843a8b2e4d22df9178efa3d9f31dbbd42 (diff)
downloadchromium_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.cc42
-rw-r--r--content/renderer/p2p/socket_dispatcher.h3
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);
};