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

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

Issue 10962010: Fix asan test failure in P2PSocketClient::Init. Make sure P2PSocketClient::Init only access |deleg… (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fix init. 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
« no previous file with comments | « content/renderer/p2p/socket_client.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_client.h" 5 #include "content/renderer/p2p/socket_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop_proxy.h" 8 #include "base/message_loop_proxy.h"
9 #include "content/common/p2p_messages.h" 9 #include "content/common/p2p_messages.h"
10 #include "content/renderer/p2p/socket_dispatcher.h" 10 #include "content/renderer/p2p/socket_dispatcher.h"
(...skipping 10 matching lines...) Expand all
21 21
22 P2PSocketClient::~P2PSocketClient() { 22 P2PSocketClient::~P2PSocketClient() {
23 DCHECK(state_ == STATE_CLOSED || state_ == STATE_UNINITIALIZED); 23 DCHECK(state_ == STATE_CLOSED || state_ == STATE_UNINITIALIZED);
24 } 24 }
25 25
26 void P2PSocketClient::Init( 26 void P2PSocketClient::Init(
27 P2PSocketType type, 27 P2PSocketType type,
28 const net::IPEndPoint& local_address, 28 const net::IPEndPoint& local_address,
29 const net::IPEndPoint& remote_address, 29 const net::IPEndPoint& remote_address,
30 P2PSocketClient::Delegate* delegate) { 30 P2PSocketClient::Delegate* delegate) {
31 if (!ipc_message_loop_->BelongsToCurrentThread()) { 31 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
32 ipc_message_loop_->PostTask( 32 // |delegate_| is only accessesed on |delegate_message_loop_|.
33 FROM_HERE, base::Bind(&P2PSocketClient::Init, this, type, local_address, 33 delegate_ = delegate;
tommi (sloooow) - chröme 2012/09/20 13:47:46 maybe first DCHECK(!delegate_) or is it OK for del
34 remote_address, delegate));
35 return;
36 }
37 34
35 ipc_message_loop_->PostTask(
36 FROM_HERE, base::Bind(&P2PSocketClient::DoInit, this, type, local_address,
37 remote_address));
38 }
39
40 void P2PSocketClient::DoInit(P2PSocketType type,
41 const net::IPEndPoint& local_address,
42 const net::IPEndPoint& remote_address) {
38 DCHECK_EQ(state_, STATE_UNINITIALIZED); 43 DCHECK_EQ(state_, STATE_UNINITIALIZED);
44 DCHECK(delegate_);
39 state_ = STATE_OPENING; 45 state_ = STATE_OPENING;
40 delegate_ = delegate;
41 socket_id_ = dispatcher_->RegisterClient(this); 46 socket_id_ = dispatcher_->RegisterClient(this);
42 dispatcher_->SendP2PMessage(new P2PHostMsg_CreateSocket( 47 dispatcher_->SendP2PMessage(new P2PHostMsg_CreateSocket(
43 type, socket_id_, local_address, remote_address)); 48 type, socket_id_, local_address, remote_address));
44 } 49 }
45 50
46 void P2PSocketClient::Send(const net::IPEndPoint& address, 51 void P2PSocketClient::Send(const net::IPEndPoint& address,
47 const std::vector<char>& data) { 52 const std::vector<char>& data) {
48 if (!ipc_message_loop_->BelongsToCurrentThread()) { 53 if (!ipc_message_loop_->BelongsToCurrentThread()) {
49 ipc_message_loop_->PostTask( 54 ipc_message_loop_->PostTask(
50 FROM_HERE, base::Bind(&P2PSocketClient::Send, this, address, data)); 55 FROM_HERE, base::Bind(&P2PSocketClient::Send, this, address, data));
(...skipping 10 matching lines...) Expand all
61 void P2PSocketClient::Close() { 66 void P2PSocketClient::Close() {
62 DCHECK(delegate_message_loop_->BelongsToCurrentThread()); 67 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
63 68
64 delegate_ = NULL; 69 delegate_ = NULL;
65 70
66 ipc_message_loop_->PostTask( 71 ipc_message_loop_->PostTask(
67 FROM_HERE, base::Bind(&P2PSocketClient::DoClose, this)); 72 FROM_HERE, base::Bind(&P2PSocketClient::DoClose, this));
68 } 73 }
69 74
70 void P2PSocketClient::DoClose() { 75 void P2PSocketClient::DoClose() {
76 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
71 if (dispatcher_) { 77 if (dispatcher_) {
72 if (state_ == STATE_OPEN || state_ == STATE_OPENING || 78 if (state_ == STATE_OPEN || state_ == STATE_OPENING ||
73 state_ == STATE_ERROR) { 79 state_ == STATE_ERROR) {
74 dispatcher_->SendP2PMessage(new P2PHostMsg_DestroySocket(socket_id_)); 80 dispatcher_->SendP2PMessage(new P2PHostMsg_DestroySocket(socket_id_));
75 } 81 }
76 dispatcher_->UnregisterClient(socket_id_); 82 dispatcher_->UnregisterClient(socket_id_);
77 } 83 }
78 84
79 state_ = STATE_CLOSED; 85 state_ = STATE_CLOSED;
80 } 86 }
81 87
82 void P2PSocketClient::set_delegate(Delegate* delegate) { 88 void P2PSocketClient::set_delegate(Delegate* delegate) {
83 DCHECK(delegate_message_loop_->BelongsToCurrentThread()); 89 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
84 delegate_ = delegate; 90 delegate_ = delegate;
85 } 91 }
86 92
87 void P2PSocketClient::OnSocketCreated(const net::IPEndPoint& address) { 93 void P2PSocketClient::OnSocketCreated(const net::IPEndPoint& address) {
88 DCHECK(ipc_message_loop_->BelongsToCurrentThread()); 94 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
89 DCHECK_EQ(state_, STATE_OPENING); 95 DCHECK_EQ(state_, STATE_OPENING);
90 state_ = STATE_OPEN; 96 state_ = STATE_OPEN;
91 97
92 delegate_message_loop_->PostTask( 98 delegate_message_loop_->PostTask(
93 FROM_HERE, 99 FROM_HERE,
94 base::Bind(&P2PSocketClient::DeliverOnSocketCreated, this, address)); 100 base::Bind(&P2PSocketClient::DeliverOnSocketCreated, this, address));
95 } 101 }
96 102
97 void P2PSocketClient::DeliverOnSocketCreated(const net::IPEndPoint& address) { 103 void P2PSocketClient::DeliverOnSocketCreated(const net::IPEndPoint& address) {
104 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
98 if (delegate_) 105 if (delegate_)
99 delegate_->OnOpen(address); 106 delegate_->OnOpen(address);
100 } 107 }
101 108
102 void P2PSocketClient::OnIncomingTcpConnection(const net::IPEndPoint& address) { 109 void P2PSocketClient::OnIncomingTcpConnection(const net::IPEndPoint& address) {
103 DCHECK(ipc_message_loop_->BelongsToCurrentThread()); 110 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
104 DCHECK_EQ(state_, STATE_OPEN); 111 DCHECK_EQ(state_, STATE_OPEN);
105 112
106 scoped_refptr<P2PSocketClient> new_client = new P2PSocketClient(dispatcher_); 113 scoped_refptr<P2PSocketClient> new_client = new P2PSocketClient(dispatcher_);
107 new_client->socket_id_ = dispatcher_->RegisterClient(new_client); 114 new_client->socket_id_ = dispatcher_->RegisterClient(new_client);
108 new_client->state_ = STATE_OPEN; 115 new_client->state_ = STATE_OPEN;
109 new_client->delegate_message_loop_ = delegate_message_loop_; 116 new_client->delegate_message_loop_ = delegate_message_loop_;
110 117
111 dispatcher_->SendP2PMessage(new P2PHostMsg_AcceptIncomingTcpConnection( 118 dispatcher_->SendP2PMessage(new P2PHostMsg_AcceptIncomingTcpConnection(
112 socket_id_, address, new_client->socket_id_)); 119 socket_id_, address, new_client->socket_id_));
113 120
114 delegate_message_loop_->PostTask( 121 delegate_message_loop_->PostTask(
115 FROM_HERE, base::Bind(&P2PSocketClient::DeliverOnIncomingTcpConnection, 122 FROM_HERE, base::Bind(&P2PSocketClient::DeliverOnIncomingTcpConnection,
116 this, address, new_client)); 123 this, address, new_client));
117 } 124 }
118 125
119 void P2PSocketClient::DeliverOnIncomingTcpConnection( 126 void P2PSocketClient::DeliverOnIncomingTcpConnection(
120 const net::IPEndPoint& address, scoped_refptr<P2PSocketClient> new_client) { 127 const net::IPEndPoint& address, scoped_refptr<P2PSocketClient> new_client) {
128 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
121 if (delegate_) 129 if (delegate_)
122 delegate_->OnIncomingTcpConnection(address, new_client); 130 delegate_->OnIncomingTcpConnection(address, new_client);
123 } 131 }
124 132
125 void P2PSocketClient::OnError() { 133 void P2PSocketClient::OnError() {
126 DCHECK(ipc_message_loop_->BelongsToCurrentThread()); 134 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
127 state_ = STATE_ERROR; 135 state_ = STATE_ERROR;
128 136
129 delegate_message_loop_->PostTask( 137 delegate_message_loop_->PostTask(
130 FROM_HERE, base::Bind(&P2PSocketClient::DeliverOnError, this)); 138 FROM_HERE, base::Bind(&P2PSocketClient::DeliverOnError, this));
131 } 139 }
132 140
133 void P2PSocketClient::DeliverOnError() { 141 void P2PSocketClient::DeliverOnError() {
142 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
134 if (delegate_) 143 if (delegate_)
135 delegate_->OnError(); 144 delegate_->OnError();
136 } 145 }
137 146
138 void P2PSocketClient::OnDataReceived(const net::IPEndPoint& address, 147 void P2PSocketClient::OnDataReceived(const net::IPEndPoint& address,
139 const std::vector<char>& data) { 148 const std::vector<char>& data) {
140 DCHECK(ipc_message_loop_->BelongsToCurrentThread()); 149 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
141 DCHECK_EQ(STATE_OPEN, state_); 150 DCHECK_EQ(STATE_OPEN, state_);
142 delegate_message_loop_->PostTask( 151 delegate_message_loop_->PostTask(
143 FROM_HERE, 152 FROM_HERE,
144 base::Bind(&P2PSocketClient::DeliverOnDataReceived, this, address, data)); 153 base::Bind(&P2PSocketClient::DeliverOnDataReceived, this, address, data));
145 } 154 }
146 155
147 void P2PSocketClient::DeliverOnDataReceived(const net::IPEndPoint& address, 156 void P2PSocketClient::DeliverOnDataReceived(const net::IPEndPoint& address,
148 const std::vector<char>& data) { 157 const std::vector<char>& data) {
158 DCHECK(delegate_message_loop_->BelongsToCurrentThread());
149 if (delegate_) 159 if (delegate_)
150 delegate_->OnDataReceived(address, data); 160 delegate_->OnDataReceived(address, data);
151 } 161 }
152 162
153 void P2PSocketClient::Detach() { 163 void P2PSocketClient::Detach() {
154 DCHECK(ipc_message_loop_->BelongsToCurrentThread()); 164 DCHECK(ipc_message_loop_->BelongsToCurrentThread());
155 dispatcher_ = NULL; 165 dispatcher_ = NULL;
156 OnError(); 166 OnError();
157 } 167 }
158 168
159 } // namespace content 169 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/p2p/socket_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698