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

Side by Side Diff: runtime/bin/socket_patch.dart

Issue 429543002: In Socket:connect, start connecting to next address, after 250 (25 for loopback). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 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
« no previous file with comments | « no previous file | 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class RawServerSocket { 5 patch class RawServerSocket {
6 /* patch */ static Future<RawServerSocket> bind(address, 6 /* patch */ static Future<RawServerSocket> bind(address,
7 int port, 7 int port,
8 {int backlog: 0, 8 {int backlog: 0,
9 bool v6Only: false}) { 9 bool v6Only: false}) {
10 return _RawServerSocket.bind(address, port, backlog, v6Only); 10 return _RawServerSocket.bind(address, port, backlog, v6Only);
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 static const LIST_INTERFACES = 1; 266 static const LIST_INTERFACES = 1;
267 static const REVERSE_LOOKUP = 2; 267 static const REVERSE_LOOKUP = 2;
268 268
269 // Protocol flags. 269 // Protocol flags.
270 static const int PROTOCOL_IPV4 = 1 << 0; 270 static const int PROTOCOL_IPV4 = 1 << 0;
271 static const int PROTOCOL_IPV6 = 1 << 1; 271 static const int PROTOCOL_IPV6 = 1 << 1;
272 272
273 static const int NORMAL_TOKEN_BATCH_SIZE = 8; 273 static const int NORMAL_TOKEN_BATCH_SIZE = 8;
274 static const int LISTENING_TOKEN_BATCH_SIZE = 2; 274 static const int LISTENING_TOKEN_BATCH_SIZE = 2;
275 275
276 static const Duration _RETRY_DURATION = const Duration(milliseconds: 250);
277 static const Duration _RETRY_DURATION_LOOPBACK =
278 const Duration(milliseconds: 25);
279
276 // Use default Map so we keep order. 280 // Use default Map so we keep order.
277 static Map<int, _NativeSocket> _sockets = new Map<int, _NativeSocket>(); 281 static Map<int, _NativeSocket> _sockets = new Map<int, _NativeSocket>();
278 282
279 // Socket close state 283 // Socket close state
280 bool isClosed = false; 284 bool isClosed = false;
281 bool isClosing = false; 285 bool isClosing = false;
282 bool isClosedRead = false; 286 bool isClosedRead = false;
283 bool isClosedWrite = false; 287 bool isClosedWrite = false;
284 Completer closeCompleter = new Completer.sync(); 288 Completer closeCompleter = new Completer.sync();
285 289
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 return map.values.toList(); 378 return map.values.toList();
375 } 379 }
376 }); 380 });
377 } 381 }
378 382
379 static Future<_NativeSocket> connect(host, int port) { 383 static Future<_NativeSocket> connect(host, int port) {
380 return new Future.value(host) 384 return new Future.value(host)
381 .then((host) { 385 .then((host) {
382 if (host is _InternetAddress) return [host]; 386 if (host is _InternetAddress) return [host];
383 return lookup(host) 387 return lookup(host)
384 .then((list) { 388 .then((addresses) {
385 if (list.length == 0) { 389 if (addresses.isEmpty) {
386 throw createError(response, "Failed host lookup: '$host'"); 390 throw createError(response, "Failed host lookup: '$host'");
387 } 391 }
388 return list; 392 return addresses;
389 }); 393 });
390 }) 394 })
391 .then((addresses) { 395 .then((addresses) {
392 assert(addresses is List); 396 assert(addresses is List);
393 var completer = new Completer(); 397 var completer = new Completer();
394 var it = addresses.iterator; 398 var it = addresses.iterator;
395 void run(error) { 399 var error = null;
400 var connecting = new HashMap();
401 void connectNext() {
396 if (!it.moveNext()) { 402 if (!it.moveNext()) {
397 assert(error != null); 403 if (connecting.isEmpty) {
398 completer.completeError(error); 404 assert(error != null);
405 completer.completeError(error);
406 }
399 return; 407 return;
400 } 408 }
401 var address = it.current; 409 var address = it.current;
402 var socket = new _NativeSocket.normal(); 410 var socket = new _NativeSocket.normal();
403 socket.address = address; 411 socket.address = address;
404 var result = socket.nativeCreateConnect(address._in_addr, port); 412 var result = socket.nativeCreateConnect(address._in_addr, port);
405 if (result is OSError) { 413 if (result is OSError) {
406 // Keep first error, if present. 414 // Keep first error, if present.
407 run(error != null ? error : 415 if (error == null) {
408 createError(result, "Connection failed", address, port)); 416 error = createError(result, "Connection failed", address, port);
417 }
418 connectNext();
409 } else { 419 } else {
410 socket.port; // Query the local port, for error messages. 420 socket.port; // Query the local port, for error messages.
421 // Set up timer for when we should retry the next address (if any) .
Søren Gjesse 2014/08/04 09:21:37 Long line.
Anders Johnsen 2014/08/05 09:14:55 Done.
422 var duration = address.isLoopback ?
423 _RETRY_DURATION_LOOPBACK :
424 _RETRY_DURATION;
425 var timer = new Timer(duration, connectNext);
426 connecting[socket] = timer;
411 // Setup handlers for receiving the first write event which 427 // Setup handlers for receiving the first write event which
412 // indicate that the socket is fully connected. 428 // indicate that the socket is fully connected.
413 socket.setHandlers( 429 socket.setHandlers(
414 write: () { 430 write: () {
431 timer.cancel();
415 socket.setListening(read: false, write: false); 432 socket.setListening(read: false, write: false);
416 completer.complete(socket); 433 completer.complete(socket);
434 connecting.remove(socket);
435 connecting.forEach((s, t) {
436 t.cancel();
437 s.close();
Søren Gjesse 2014/08/04 09:21:37 Shouldn't s.destroy() be enough?
Anders Johnsen 2014/08/05 09:14:55 There is no destroy on _NativeSocket. We need to c
438 s.setHandlers();
439 s.setListening(read: false, write: false);
440 });
417 }, 441 },
418 error: (e) { 442 error: (e) {
443 timer.cancel();
419 socket.close(); 444 socket.close();
420 // Keep first error, if present. 445 // Keep first error, if present.
421 run(error != null ? error : e); 446 if (error == null) error = e;
422 } 447 connecting.remove(socket);
423 ); 448 if (connecting.isEmpty) connectNext();
449 });
424 socket.setListening(read: false, write: true); 450 socket.setListening(read: false, write: true);
425 } 451 }
426 } 452 }
427 run(null); 453 connectNext();
428 return completer.future; 454 return completer.future;
429 }); 455 });
430 } 456 }
431 457
432 static Future<_NativeSocket> bind(host, 458 static Future<_NativeSocket> bind(host,
433 int port, 459 int port,
434 int backlog, 460 int backlog,
435 bool v6Only) { 461 bool v6Only) {
436 return new Future.value(host) 462 return new Future.value(host)
437 .then((host) { 463 .then((host) {
(...skipping 1464 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 String address, 1928 String address,
1903 List<int> in_addr, 1929 List<int> in_addr,
1904 int port) { 1930 int port) {
1905 return new Datagram( 1931 return new Datagram(
1906 data, 1932 data,
1907 new _InternetAddress(address, null, in_addr), 1933 new _InternetAddress(address, null, in_addr),
1908 port); 1934 port);
1909 } 1935 }
1910 1936
1911 String _socketsStats() => _SocketsObservatory.toJSON(); 1937 String _socketsStats() => _SocketsObservatory.toJSON();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698