Chromium Code Reviews| Index: content/renderer/p2p/socket_dispatcher.cc |
| diff --git a/content/renderer/p2p/socket_dispatcher.cc b/content/renderer/p2p/socket_dispatcher.cc |
| index f3f29b87d93465175636feb01f9ba7883c761157..cf7cd56c2081584e0b77d4eb0dc8bf775053a543 100644 |
| --- a/content/renderer/p2p/socket_dispatcher.cc |
| +++ b/content/renderer/p2p/socket_dispatcher.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/bind.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/message_loop_proxy.h" |
| +#include "content/common/child_process.h" |
| #include "content/common/p2p_messages.h" |
| #include "content/renderer/p2p/host_address_request.h" |
| #include "content/renderer/p2p/socket_client.h" |
| @@ -18,52 +19,48 @@ namespace content { |
| class P2PSocketDispatcher::AsyncMessageSender |
| : public base::RefCountedThreadSafe<AsyncMessageSender> { |
| public: |
| - explicit AsyncMessageSender(IPC::Sender* message_sender) |
| - : message_loop_(base::MessageLoopProxy::current()), |
| - message_sender_(message_sender) { |
| + explicit AsyncMessageSender(P2PSocketDispatcher* message_sender) |
| + : 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)); |
| + if (!message_sender_) { |
| + delete msg; |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
maybe log an error or NOTREACHED?
perkj_chrome
2012/09/11 14:27:30
removed
|
| + return; |
| + } |
| + base::MessageLoopProxy* loop = message_sender_->message_loop(); |
| + loop->PostTask( |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
what if you're already on the right thread? Can't
perkj_chrome
2012/09/11 14:27:30
Done.
|
| + FROM_HERE, base::Bind(&P2PSocketDispatcher::Send, |
| + message_sender_.get(), msg)); |
| } |
| private: |
| friend class base::RefCountedThreadSafe<AsyncMessageSender>; |
| ~AsyncMessageSender() {} |
| - void DoSend(IPC::Message* msg) { |
| - DCHECK(message_loop_->BelongsToCurrentThread()); |
| - if (message_sender_) |
| - message_sender_->Send(msg); |
| - } |
| - |
| - scoped_refptr<base::MessageLoopProxy> message_loop_; |
| - IPC::Sender* message_sender_; |
| + scoped_refptr<P2PSocketDispatcher> message_sender_; |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
Since both AsyncMessageSender and P2PSocketDispatc
perkj_chrome
2012/09/11 14:27:30
Removed the AsyncMessageSender.
On 2012/09/11 12:0
|
| DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender); |
| }; |
| -P2PSocketDispatcher::P2PSocketDispatcher(RenderViewImpl* render_view) |
| - : content::RenderViewObserver(render_view), |
| - message_loop_(base::MessageLoopProxy::current()), |
| +P2PSocketDispatcher::P2PSocketDispatcher( |
| + base::MessageLoopProxy* ipc_message_loop) |
| + : message_loop_(ipc_message_loop), |
| network_notifications_started_(false), |
| network_list_observers_( |
| new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()), |
| - async_message_sender_(new AsyncMessageSender(this)) { |
| + async_message_sender_(new AsyncMessageSender(this)), |
| + channel_(NULL) { |
| } |
| P2PSocketDispatcher::~P2PSocketDispatcher() { |
| - FOR_EACH_OBSERVER(P2PSocketDispatcherDestructionObserver, |
| - destruction_observer_, OnSocketDispatcherDestroyed()); |
| network_list_observers_->AssertEmpty(); |
| if (network_notifications_started_) |
| - Send(new P2PHostMsg_StopNetworkNotifications(routing_id())); |
| + Send(new P2PHostMsg_StopNetworkNotifications()); |
| for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd(); |
| i.Advance()) { |
| i.GetCurrentValue()->Detach(); |
| @@ -76,7 +73,7 @@ void P2PSocketDispatcher::AddNetworkListObserver( |
| network_list_observers_->AddObserver(network_list_observer); |
| network_notifications_started_ = true; |
| async_message_sender_->Send( |
| - new P2PHostMsg_StartNetworkNotifications(routing_id())); |
| + new P2PHostMsg_StartNetworkNotifications()); |
| } |
| void P2PSocketDispatcher::RemoveNetworkListObserver( |
| @@ -84,14 +81,14 @@ void P2PSocketDispatcher::RemoveNetworkListObserver( |
| network_list_observers_->RemoveObserver(network_list_observer); |
| } |
| -void P2PSocketDispatcher::AddDestructionObserver( |
| - P2PSocketDispatcherDestructionObserver* observer) { |
| - destruction_observer_.AddObserver(observer); |
| -} |
| +void P2PSocketDispatcher::Send(IPC::Message* message) { |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| + if (!channel_) { |
| + delete message; |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
log warning/error?
perkj_chrome
2012/09/11 14:27:30
Done.
|
| + return; |
| + } |
| -void P2PSocketDispatcher::RemoveDestructionObserver( |
| - P2PSocketDispatcherDestructionObserver* observer) { |
| - destruction_observer_.RemoveObserver(observer); |
| + channel_->Send(message); |
| } |
| bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) { |
| @@ -108,29 +105,47 @@ bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) { |
| return handled; |
| } |
| +void P2PSocketDispatcher::OnFilterAdded(IPC::Channel* channel) { |
| + DVLOG(1) << "P2PSocketDispatcher::OnFilterAdded()"; |
| + // Captures the channel for IPC. |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
unnecessary comment
perkj_chrome
2012/09/11 14:27:30
Done.
tommi (sloooow) - chröme
2012/09/11 15:08:58
don't see the change
perkj_chrome
2012/09/11 15:21:57
Done.
|
| + channel_ = channel; |
| +} |
| + |
| +void P2PSocketDispatcher::OnFilterRemoved() { |
| + channel_ = NULL; |
| +} |
| + |
| +void P2PSocketDispatcher::OnChannelClosing() { |
| + channel_ = NULL; |
|
tommi (sloooow) - chröme
2012/09/11 12:09:09
I think we should use this opportunity to delete/r
perkj_chrome
2012/09/11 14:27:30
Removed it all together.
Changed Send2PMessage to
tommi (sloooow) - chröme
2012/09/11 15:08:58
great!
|
| +} |
| + |
| base::MessageLoopProxy* P2PSocketDispatcher::message_loop() { |
| return message_loop_; |
| } |
| int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) { |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| return clients_.Add(client); |
| } |
| void P2PSocketDispatcher::UnregisterClient(int id) { |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| clients_.Remove(id); |
| } |
| void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) { |
| - msg->set_routing_id(routing_id()); |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| Send(msg); |
| } |
| int P2PSocketDispatcher::RegisterHostAddressRequest( |
| P2PHostAddressRequest* request) { |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| return host_address_requests_.Add(request); |
| } |
| void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) { |
| + DCHECK(message_loop_->BelongsToCurrentThread()); |
| host_address_requests_.Remove(id); |
| } |