summaryrefslogtreecommitdiffstats
path: root/content/renderer/p2p/socket_dispatcher.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/renderer/p2p/socket_dispatcher.cc')
-rw-r--r--content/renderer/p2p/socket_dispatcher.cc42
1 files changed, 38 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) {