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

Side by Side Diff: net/udp/udp_socket_win.cc

Issue 8801005: base::Bind: Convert Socket::Read. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review fixes. Created 9 years 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
« no previous file with comments | « net/udp/udp_socket_win.h ('k') | remoting/jingle_glue/ssl_socket_adapter.h » ('j') | 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 "net/udp/udp_socket_win.h" 5 #include "net/udp/udp_socket_win.h"
6 6
7 #include <mstcpip.h> 7 #include <mstcpip.h>
8 8
9 #include "base/eintr_wrapper.h" 9 #include "base/eintr_wrapper.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 UDPSocketWin::UDPSocketWin(DatagramSocket::BindType bind_type, 44 UDPSocketWin::UDPSocketWin(DatagramSocket::BindType bind_type,
45 const RandIntCallback& rand_int_cb, 45 const RandIntCallback& rand_int_cb,
46 net::NetLog* net_log, 46 net::NetLog* net_log,
47 const net::NetLog::Source& source) 47 const net::NetLog::Source& source)
48 : socket_(INVALID_SOCKET), 48 : socket_(INVALID_SOCKET),
49 bind_type_(bind_type), 49 bind_type_(bind_type),
50 rand_int_cb_(rand_int_cb), 50 rand_int_cb_(rand_int_cb),
51 ALLOW_THIS_IN_INITIALIZER_LIST(read_delegate_(this)), 51 ALLOW_THIS_IN_INITIALIZER_LIST(read_delegate_(this)),
52 ALLOW_THIS_IN_INITIALIZER_LIST(write_delegate_(this)), 52 ALLOW_THIS_IN_INITIALIZER_LIST(write_delegate_(this)),
53 recv_from_address_(NULL), 53 recv_from_address_(NULL),
54 read_callback_(NULL), 54 old_read_callback_(NULL),
55 write_callback_(NULL), 55 write_callback_(NULL),
56 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) { 56 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) {
57 EnsureWinsockInit(); 57 EnsureWinsockInit();
58 scoped_refptr<NetLog::EventParameters> params; 58 scoped_refptr<NetLog::EventParameters> params;
59 if (source.is_valid()) 59 if (source.is_valid())
60 params = new NetLogSourceParameter("source_dependency", source); 60 params = new NetLogSourceParameter("source_dependency", source);
61 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, params); 61 net_log_.BeginEvent(NetLog::TYPE_SOCKET_ALIVE, params);
62 memset(&read_overlapped_, 0, sizeof(read_overlapped_)); 62 memset(&read_overlapped_, 0, sizeof(read_overlapped_));
63 read_overlapped_.hEvent = WSACreateEvent(); 63 read_overlapped_.hEvent = WSACreateEvent();
64 memset(&write_overlapped_, 0, sizeof(write_overlapped_)); 64 memset(&write_overlapped_, 0, sizeof(write_overlapped_));
65 write_overlapped_.hEvent = WSACreateEvent(); 65 write_overlapped_.hEvent = WSACreateEvent();
66 if (bind_type == DatagramSocket::RANDOM_BIND) 66 if (bind_type == DatagramSocket::RANDOM_BIND)
67 DCHECK(!rand_int_cb.is_null()); 67 DCHECK(!rand_int_cb.is_null());
68 } 68 }
69 69
70 UDPSocketWin::~UDPSocketWin() { 70 UDPSocketWin::~UDPSocketWin() {
71 Close(); 71 Close();
72 net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE, NULL); 72 net_log_.EndEvent(NetLog::TYPE_SOCKET_ALIVE, NULL);
73 } 73 }
74 74
75 void UDPSocketWin::Close() { 75 void UDPSocketWin::Close() {
76 DCHECK(CalledOnValidThread()); 76 DCHECK(CalledOnValidThread());
77 77
78 if (!is_connected()) 78 if (!is_connected())
79 return; 79 return;
80 80
81 // Zero out any pending read/write callback state. 81 // Zero out any pending read/write callback state.
82 read_callback_ = NULL; 82 old_read_callback_ = NULL;
83 read_callback_.Reset();
83 recv_from_address_ = NULL; 84 recv_from_address_ = NULL;
84 write_callback_ = NULL; 85 write_callback_ = NULL;
85 86
86 read_watcher_.StopWatching(); 87 read_watcher_.StopWatching();
87 write_watcher_.StopWatching(); 88 write_watcher_.StopWatching();
88 89
89 closesocket(socket_); 90 closesocket(socket_);
90 socket_ = INVALID_SOCKET; 91 socket_ = INVALID_SOCKET;
91 } 92 }
92 93
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 133
133 *address = *local_address_; 134 *address = *local_address_;
134 return OK; 135 return OK;
135 } 136 }
136 137
137 int UDPSocketWin::Read(IOBuffer* buf, 138 int UDPSocketWin::Read(IOBuffer* buf,
138 int buf_len, 139 int buf_len,
139 OldCompletionCallback* callback) { 140 OldCompletionCallback* callback) {
140 return RecvFrom(buf, buf_len, NULL, callback); 141 return RecvFrom(buf, buf_len, NULL, callback);
141 } 142 }
143 int UDPSocketWin::Read(IOBuffer* buf,
144 int buf_len,
145 const CompletionCallback& callback) {
146 return RecvFrom(buf, buf_len, NULL, callback);
147 }
142 148
143 int UDPSocketWin::RecvFrom(IOBuffer* buf, 149 int UDPSocketWin::RecvFrom(IOBuffer* buf,
144 int buf_len, 150 int buf_len,
145 IPEndPoint* address, 151 IPEndPoint* address,
146 OldCompletionCallback* callback) { 152 OldCompletionCallback* callback) {
147 DCHECK(CalledOnValidThread()); 153 DCHECK(CalledOnValidThread());
148 DCHECK_NE(INVALID_SOCKET, socket_); 154 DCHECK_NE(INVALID_SOCKET, socket_);
149 DCHECK(!read_callback_); 155 DCHECK(!old_read_callback_ && read_callback_.is_null());
150 DCHECK(!recv_from_address_); 156 DCHECK(!recv_from_address_);
151 DCHECK(callback); // Synchronous operation not supported. 157 DCHECK(callback); // Synchronous operation not supported.
152 DCHECK_GT(buf_len, 0); 158 DCHECK_GT(buf_len, 0);
153 159
154 int nread = InternalRecvFrom(buf, buf_len, address); 160 int nread = InternalRecvFrom(buf, buf_len, address);
155 if (nread != ERR_IO_PENDING) 161 if (nread != ERR_IO_PENDING)
156 return nread; 162 return nread;
157 163
158 read_iobuffer_ = buf; 164 read_iobuffer_ = buf;
165 old_read_callback_ = callback;
166 recv_from_address_ = address;
167 return ERR_IO_PENDING;
168 }
169 int UDPSocketWin::RecvFrom(IOBuffer* buf,
170 int buf_len,
171 IPEndPoint* address,
172 const CompletionCallback& callback) {
173 DCHECK(CalledOnValidThread());
174 DCHECK_NE(INVALID_SOCKET, socket_);
175 DCHECK(!old_read_callback_ && read_callback_.is_null());
176 DCHECK(!recv_from_address_);
177 DCHECK(!callback.is_null()); // Synchronous operation not supported.
178 DCHECK_GT(buf_len, 0);
179
180 int nread = InternalRecvFrom(buf, buf_len, address);
181 if (nread != ERR_IO_PENDING)
182 return nread;
183
184 read_iobuffer_ = buf;
159 read_callback_ = callback; 185 read_callback_ = callback;
160 recv_from_address_ = address; 186 recv_from_address_ = address;
161 return ERR_IO_PENDING; 187 return ERR_IO_PENDING;
162 } 188 }
163 189
164 int UDPSocketWin::Write(IOBuffer* buf, 190 int UDPSocketWin::Write(IOBuffer* buf,
165 int buf_len, 191 int buf_len,
166 OldCompletionCallback* callback) { 192 OldCompletionCallback* callback) {
167 return SendToOrWrite(buf, buf_len, NULL, callback); 193 return SendToOrWrite(buf, buf_len, NULL, callback);
168 } 194 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 bool UDPSocketWin::SetSendBufferSize(int32 size) { 291 bool UDPSocketWin::SetSendBufferSize(int32 size) {
266 DCHECK(CalledOnValidThread()); 292 DCHECK(CalledOnValidThread());
267 int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF, 293 int rv = setsockopt(socket_, SOL_SOCKET, SO_SNDBUF,
268 reinterpret_cast<const char*>(&size), sizeof(size)); 294 reinterpret_cast<const char*>(&size), sizeof(size));
269 DCHECK(!rv) << "Could not set socket send buffer size: " << errno; 295 DCHECK(!rv) << "Could not set socket send buffer size: " << errno;
270 return rv == 0; 296 return rv == 0;
271 } 297 }
272 298
273 void UDPSocketWin::DoReadCallback(int rv) { 299 void UDPSocketWin::DoReadCallback(int rv) {
274 DCHECK_NE(rv, ERR_IO_PENDING); 300 DCHECK_NE(rv, ERR_IO_PENDING);
275 DCHECK(read_callback_); 301 DCHECK(old_read_callback_ || !read_callback_.is_null());
276 302
277 // since Run may result in Read being called, clear read_callback_ up front. 303 // since Run may result in Read being called, clear read_callback_ up front.
278 OldCompletionCallback* c = read_callback_; 304 if (old_read_callback_) {
279 read_callback_ = NULL; 305 OldCompletionCallback* c = old_read_callback_;
280 c->Run(rv); 306 old_read_callback_ = NULL;
307 c->Run(rv);
308 } else {
309 CompletionCallback c = read_callback_;
310 read_callback_.Reset();
311 c.Run(rv);
312 }
281 } 313 }
282 314
283 void UDPSocketWin::DoWriteCallback(int rv) { 315 void UDPSocketWin::DoWriteCallback(int rv) {
284 DCHECK_NE(rv, ERR_IO_PENDING); 316 DCHECK_NE(rv, ERR_IO_PENDING);
285 DCHECK(write_callback_); 317 DCHECK(write_callback_);
286 318
287 // since Run may result in Write being called, clear write_callback_ up front. 319 // since Run may result in Write being called, clear write_callback_ up front.
288 OldCompletionCallback* c = write_callback_; 320 OldCompletionCallback* c = write_callback_;
289 write_callback_ = NULL; 321 write_callback_ = NULL;
290 c->Run(rv); 322 c->Run(rv);
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 return DoBind(IPEndPoint(ip, 0)); 503 return DoBind(IPEndPoint(ip, 0));
472 } 504 }
473 505
474 bool UDPSocketWin::ReceiveAddressToIPEndpoint(IPEndPoint* address) const { 506 bool UDPSocketWin::ReceiveAddressToIPEndpoint(IPEndPoint* address) const {
475 const struct sockaddr* addr = 507 const struct sockaddr* addr =
476 reinterpret_cast<const struct sockaddr*>(&recv_addr_storage_); 508 reinterpret_cast<const struct sockaddr*>(&recv_addr_storage_);
477 return address->FromSockAddr(addr, recv_addr_len_); 509 return address->FromSockAddr(addr, recv_addr_len_);
478 } 510 }
479 511
480 } // namespace net 512 } // namespace net
OLDNEW
« no previous file with comments | « net/udp/udp_socket_win.h ('k') | remoting/jingle_glue/ssl_socket_adapter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698