Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(419)

Side by Side Diff: content/renderer/p2p/socket_dispatcher.cc

Issue 10917167: Refactor the P2PSocketDispatcher to be created on the RenderThread instead of the RenderView. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed unnecessary destruction callback. Removed remaining routing_id. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/p2p/socket_dispatcher.h" 5 #include "content/renderer/p2p/socket_dispatcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/message_loop_proxy.h" 9 #include "base/message_loop_proxy.h"
10 #include "content/common/child_process.h"
10 #include "content/common/p2p_messages.h" 11 #include "content/common/p2p_messages.h"
11 #include "content/renderer/p2p/host_address_request.h" 12 #include "content/renderer/p2p/host_address_request.h"
12 #include "content/renderer/p2p/socket_client.h" 13 #include "content/renderer/p2p/socket_client.h"
13 #include "content/renderer/render_view_impl.h" 14 #include "content/renderer/render_view_impl.h"
14 #include "webkit/glue/network_list_observer.h" 15 #include "webkit/glue/network_list_observer.h"
15 16
16 namespace content { 17 namespace content {
17 18
18 class P2PSocketDispatcher::AsyncMessageSender 19 class P2PSocketDispatcher::AsyncMessageSender
19 : public base::RefCountedThreadSafe<AsyncMessageSender> { 20 : public base::RefCountedThreadSafe<AsyncMessageSender> {
20 public: 21 public:
21 explicit AsyncMessageSender(IPC::Sender* message_sender) 22 explicit AsyncMessageSender(P2PSocketDispatcher* message_sender)
22 : message_loop_(base::MessageLoopProxy::current()), 23 : message_sender_(message_sender) {
23 message_sender_(message_sender) {
24 } 24 }
25 25
26 void Detach() { 26 void Detach() {
27 DCHECK(message_loop_->BelongsToCurrentThread());
28 message_sender_ = NULL; 27 message_sender_ = NULL;
29 } 28 }
30 29
31 void Send(IPC::Message* msg) { 30 void Send(IPC::Message* msg) {
32 message_loop_->PostTask(FROM_HERE, 31 if (!message_sender_) {
33 base::Bind(&AsyncMessageSender::DoSend, this, msg)); 32 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
33 return;
34 }
35 base::MessageLoopProxy* loop = message_sender_->message_loop();
36 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.
37 FROM_HERE, base::Bind(&P2PSocketDispatcher::Send,
38 message_sender_.get(), msg));
34 } 39 }
35 40
36 private: 41 private:
37 friend class base::RefCountedThreadSafe<AsyncMessageSender>; 42 friend class base::RefCountedThreadSafe<AsyncMessageSender>;
38 ~AsyncMessageSender() {} 43 ~AsyncMessageSender() {}
39 44
40 void DoSend(IPC::Message* msg) { 45 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
41 DCHECK(message_loop_->BelongsToCurrentThread());
42 if (message_sender_)
43 message_sender_->Send(msg);
44 }
45
46 scoped_refptr<base::MessageLoopProxy> message_loop_;
47 IPC::Sender* message_sender_;
48 46
49 DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender); 47 DISALLOW_COPY_AND_ASSIGN(AsyncMessageSender);
50 }; 48 };
51 49
52 P2PSocketDispatcher::P2PSocketDispatcher(RenderViewImpl* render_view) 50 P2PSocketDispatcher::P2PSocketDispatcher(
53 : content::RenderViewObserver(render_view), 51 base::MessageLoopProxy* ipc_message_loop)
54 message_loop_(base::MessageLoopProxy::current()), 52 : message_loop_(ipc_message_loop),
55 network_notifications_started_(false), 53 network_notifications_started_(false),
56 network_list_observers_( 54 network_list_observers_(
57 new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()), 55 new ObserverListThreadSafe<webkit_glue::NetworkListObserver>()),
58 async_message_sender_(new AsyncMessageSender(this)) { 56 async_message_sender_(new AsyncMessageSender(this)),
57 channel_(NULL) {
59 } 58 }
60 59
61 P2PSocketDispatcher::~P2PSocketDispatcher() { 60 P2PSocketDispatcher::~P2PSocketDispatcher() {
62 FOR_EACH_OBSERVER(P2PSocketDispatcherDestructionObserver,
63 destruction_observer_, OnSocketDispatcherDestroyed());
64 network_list_observers_->AssertEmpty(); 61 network_list_observers_->AssertEmpty();
65 if (network_notifications_started_) 62 if (network_notifications_started_)
66 Send(new P2PHostMsg_StopNetworkNotifications(routing_id())); 63 Send(new P2PHostMsg_StopNetworkNotifications());
67 for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd(); 64 for (IDMap<P2PSocketClient>::iterator i(&clients_); !i.IsAtEnd();
68 i.Advance()) { 65 i.Advance()) {
69 i.GetCurrentValue()->Detach(); 66 i.GetCurrentValue()->Detach();
70 } 67 }
71 async_message_sender_->Detach(); 68 async_message_sender_->Detach();
72 } 69 }
73 70
74 void P2PSocketDispatcher::AddNetworkListObserver( 71 void P2PSocketDispatcher::AddNetworkListObserver(
75 webkit_glue::NetworkListObserver* network_list_observer) { 72 webkit_glue::NetworkListObserver* network_list_observer) {
76 network_list_observers_->AddObserver(network_list_observer); 73 network_list_observers_->AddObserver(network_list_observer);
77 network_notifications_started_ = true; 74 network_notifications_started_ = true;
78 async_message_sender_->Send( 75 async_message_sender_->Send(
79 new P2PHostMsg_StartNetworkNotifications(routing_id())); 76 new P2PHostMsg_StartNetworkNotifications());
80 } 77 }
81 78
82 void P2PSocketDispatcher::RemoveNetworkListObserver( 79 void P2PSocketDispatcher::RemoveNetworkListObserver(
83 webkit_glue::NetworkListObserver* network_list_observer) { 80 webkit_glue::NetworkListObserver* network_list_observer) {
84 network_list_observers_->RemoveObserver(network_list_observer); 81 network_list_observers_->RemoveObserver(network_list_observer);
85 } 82 }
86 83
87 void P2PSocketDispatcher::AddDestructionObserver( 84 void P2PSocketDispatcher::Send(IPC::Message* message) {
88 P2PSocketDispatcherDestructionObserver* observer) { 85 DCHECK(message_loop_->BelongsToCurrentThread());
89 destruction_observer_.AddObserver(observer); 86 if (!channel_) {
90 } 87 delete message;
tommi (sloooow) - chröme 2012/09/11 12:09:09 log warning/error?
perkj_chrome 2012/09/11 14:27:30 Done.
88 return;
89 }
91 90
92 void P2PSocketDispatcher::RemoveDestructionObserver( 91 channel_->Send(message);
93 P2PSocketDispatcherDestructionObserver* observer) {
94 destruction_observer_.RemoveObserver(observer);
95 } 92 }
96 93
97 bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) { 94 bool P2PSocketDispatcher::OnMessageReceived(const IPC::Message& message) {
98 bool handled = true; 95 bool handled = true;
99 IPC_BEGIN_MESSAGE_MAP(P2PSocketDispatcher, message) 96 IPC_BEGIN_MESSAGE_MAP(P2PSocketDispatcher, message)
100 IPC_MESSAGE_HANDLER(P2PMsg_NetworkListChanged, OnNetworkListChanged) 97 IPC_MESSAGE_HANDLER(P2PMsg_NetworkListChanged, OnNetworkListChanged)
101 IPC_MESSAGE_HANDLER(P2PMsg_GetHostAddressResult, OnGetHostAddressResult) 98 IPC_MESSAGE_HANDLER(P2PMsg_GetHostAddressResult, OnGetHostAddressResult)
102 IPC_MESSAGE_HANDLER(P2PMsg_OnSocketCreated, OnSocketCreated) 99 IPC_MESSAGE_HANDLER(P2PMsg_OnSocketCreated, OnSocketCreated)
103 IPC_MESSAGE_HANDLER(P2PMsg_OnIncomingTcpConnection, OnIncomingTcpConnection) 100 IPC_MESSAGE_HANDLER(P2PMsg_OnIncomingTcpConnection, OnIncomingTcpConnection)
104 IPC_MESSAGE_HANDLER(P2PMsg_OnError, OnError) 101 IPC_MESSAGE_HANDLER(P2PMsg_OnError, OnError)
105 IPC_MESSAGE_HANDLER(P2PMsg_OnDataReceived, OnDataReceived) 102 IPC_MESSAGE_HANDLER(P2PMsg_OnDataReceived, OnDataReceived)
106 IPC_MESSAGE_UNHANDLED(handled = false) 103 IPC_MESSAGE_UNHANDLED(handled = false)
107 IPC_END_MESSAGE_MAP() 104 IPC_END_MESSAGE_MAP()
108 return handled; 105 return handled;
109 } 106 }
110 107
108 void P2PSocketDispatcher::OnFilterAdded(IPC::Channel* channel) {
109 DVLOG(1) << "P2PSocketDispatcher::OnFilterAdded()";
110 // 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.
111 channel_ = channel;
112 }
113
114 void P2PSocketDispatcher::OnFilterRemoved() {
115 channel_ = NULL;
116 }
117
118 void P2PSocketDispatcher::OnChannelClosing() {
119 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!
120 }
121
111 base::MessageLoopProxy* P2PSocketDispatcher::message_loop() { 122 base::MessageLoopProxy* P2PSocketDispatcher::message_loop() {
112 return message_loop_; 123 return message_loop_;
113 } 124 }
114 125
115 int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) { 126 int P2PSocketDispatcher::RegisterClient(P2PSocketClient* client) {
127 DCHECK(message_loop_->BelongsToCurrentThread());
116 return clients_.Add(client); 128 return clients_.Add(client);
117 } 129 }
118 130
119 void P2PSocketDispatcher::UnregisterClient(int id) { 131 void P2PSocketDispatcher::UnregisterClient(int id) {
132 DCHECK(message_loop_->BelongsToCurrentThread());
120 clients_.Remove(id); 133 clients_.Remove(id);
121 } 134 }
122 135
123 void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) { 136 void P2PSocketDispatcher::SendP2PMessage(IPC::Message* msg) {
124 msg->set_routing_id(routing_id()); 137 DCHECK(message_loop_->BelongsToCurrentThread());
125 Send(msg); 138 Send(msg);
126 } 139 }
127 140
128 int P2PSocketDispatcher::RegisterHostAddressRequest( 141 int P2PSocketDispatcher::RegisterHostAddressRequest(
129 P2PHostAddressRequest* request) { 142 P2PHostAddressRequest* request) {
143 DCHECK(message_loop_->BelongsToCurrentThread());
130 return host_address_requests_.Add(request); 144 return host_address_requests_.Add(request);
131 } 145 }
132 146
133 void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) { 147 void P2PSocketDispatcher::UnregisterHostAddressRequest(int id) {
148 DCHECK(message_loop_->BelongsToCurrentThread());
134 host_address_requests_.Remove(id); 149 host_address_requests_.Remove(id);
135 } 150 }
136 151
137 void P2PSocketDispatcher::OnNetworkListChanged( 152 void P2PSocketDispatcher::OnNetworkListChanged(
138 const net::NetworkInterfaceList& networks) { 153 const net::NetworkInterfaceList& networks) {
139 network_list_observers_->Notify( 154 network_list_observers_->Notify(
140 &webkit_glue::NetworkListObserver::OnNetworkListChanged, networks); 155 &webkit_glue::NetworkListObserver::OnNetworkListChanged, networks);
141 } 156 }
142 157
143 void P2PSocketDispatcher::OnGetHostAddressResult( 158 void P2PSocketDispatcher::OnGetHostAddressResult(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 // hasn't processed the close message by the time it sends the 206 // hasn't processed the close message by the time it sends the
192 // message to the renderer. 207 // message to the renderer.
193 VLOG(1) << "Received P2P message for socket that doesn't exist."; 208 VLOG(1) << "Received P2P message for socket that doesn't exist.";
194 return NULL; 209 return NULL;
195 } 210 }
196 211
197 return client; 212 return client;
198 } 213 }
199 214
200 } // namespace content 215 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698