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

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

Issue 984403004: Fixed a number of bugs on RawSocket and Socket (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 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 | sdk/lib/io/socket.dart » ('j') | tests/standalone/io/raw_socket_test.dart » ('J')
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 bool shared: false}) { 10 bool shared: false}) {
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 RawReceivePort eventPort; 296 RawReceivePort eventPort;
297 bool flagsSent = false; 297 bool flagsSent = false;
298 298
299 // The type flags for this socket. 299 // The type flags for this socket.
300 final int typeFlags; 300 final int typeFlags;
301 301
302 // Holds the port of the socket, 0 if not known. 302 // Holds the port of the socket, 0 if not known.
303 int localPort = 0; 303 int localPort = 0;
304 304
305 // Holds the address used to connect or bind the socket. 305 // Holds the address used to connect or bind the socket.
306 InternetAddress address; 306 InternetAddress localAddress;
307 307
308 int available = 0; 308 int available = 0;
309 309
310 int tokens = 0; 310 int tokens = 0;
311 311
312 bool sendReadEvents = false; 312 bool sendReadEvents = false;
313 bool readEventIssued = false; 313 bool readEventIssued = false;
314 314
315 bool sendWriteEvents = false; 315 bool sendWriteEvents = false;
316 bool writeEventIssued = false; 316 bool writeEventIssued = false;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 void connectNext() { 410 void connectNext() {
411 if (!it.moveNext()) { 411 if (!it.moveNext()) {
412 if (connecting.isEmpty) { 412 if (connecting.isEmpty) {
413 assert(error != null); 413 assert(error != null);
414 completer.completeError(error); 414 completer.completeError(error);
415 } 415 }
416 return; 416 return;
417 } 417 }
418 var address = it.current; 418 var address = it.current;
419 var socket = new _NativeSocket.normal(); 419 var socket = new _NativeSocket.normal();
420 socket.address = address; 420 socket.localAddress = address;
421 var result; 421 var result;
422 if (sourceAddress == null) { 422 if (sourceAddress == null) {
423 result = socket.nativeCreateConnect(address._in_addr, port); 423 result = socket.nativeCreateConnect(address._in_addr, port);
424 } else { 424 } else {
425 assert(sourceAddress is _InternetAddress); 425 assert(sourceAddress is _InternetAddress);
426 result = socket.nativeCreateBindConnect( 426 result = socket.nativeCreateBindConnect(
427 address._in_addr, port, sourceAddress._in_addr); 427 address._in_addr, port, sourceAddress._in_addr);
428 } 428 }
429 if (result is OSError) { 429 if (result is OSError) {
430 // Keep first error, if present. 430 // Keep first error, if present.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 return lookup(host) 483 return lookup(host)
484 .then((list) { 484 .then((list) {
485 if (list.length == 0) { 485 if (list.length == 0) {
486 throw createError(response, "Failed host lookup: '$host'"); 486 throw createError(response, "Failed host lookup: '$host'");
487 } 487 }
488 return list[0]; 488 return list[0];
489 }); 489 });
490 }) 490 })
491 .then((address) { 491 .then((address) {
492 var socket = new _NativeSocket.listen(); 492 var socket = new _NativeSocket.listen();
493 socket.address = address; 493 socket.localAddress = address;
494 494
495 var result = socket.nativeCreateBindListen(address._in_addr, 495 var result = socket.nativeCreateBindListen(address._in_addr,
496 port, 496 port,
497 backlog, 497 backlog,
498 v6Only, 498 v6Only,
499 shared); 499 shared);
500 if (result is OSError) { 500 if (result is OSError) {
501 throw new SocketException("Failed to create server socket", 501 throw new SocketException("Failed to create server socket",
502 osError: result, 502 osError: result,
503 address: address, 503 address: address,
(...skipping 26 matching lines...) Expand all
530 throw new SocketException("Failed to create datagram socket", 530 throw new SocketException("Failed to create datagram socket",
531 osError: result, 531 osError: result,
532 address: address, 532 address: address,
533 port: port); 533 port: port);
534 } 534 }
535 if (port != 0) socket.localPort = port; 535 if (port != 0) socket.localPort = port;
536 return socket; 536 return socket;
537 }); 537 });
538 } 538 }
539 539
540 _NativeSocket.datagram(this.address) 540 _NativeSocket.datagram(this.localAddress)
541 : typeFlags = TYPE_NORMAL_SOCKET | TYPE_UDP_SOCKET; 541 : typeFlags = TYPE_NORMAL_SOCKET | TYPE_UDP_SOCKET;
542 542
543 _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET | TYPE_TCP_SOCKET; 543 _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET | TYPE_TCP_SOCKET;
544 544
545 _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET { 545 _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET {
546 isClosedWrite = true; 546 isClosedWrite = true;
547 } 547 }
548 548
549 _NativeSocket.pipe() : typeFlags = TYPE_PIPE; 549 _NativeSocket.pipe() : typeFlags = TYPE_PIPE;
550 550
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 _NativeSocket accept() { 664 _NativeSocket accept() {
665 // Don't issue accept if we're closing. 665 // Don't issue accept if we're closing.
666 if (isClosing || isClosed) return null; 666 if (isClosing || isClosed) return null;
667 assert(available > 0); 667 assert(available > 0);
668 available--; 668 available--;
669 tokens++; 669 tokens++;
670 returnTokens(LISTENING_TOKEN_BATCH_SIZE); 670 returnTokens(LISTENING_TOKEN_BATCH_SIZE);
671 var socket = new _NativeSocket.normal(); 671 var socket = new _NativeSocket.normal();
672 if (nativeAccept(socket) != true) return null; 672 if (nativeAccept(socket) != true) return null;
673 socket.localPort = localPort; 673 socket.localPort = localPort;
674 socket.address = address; 674 socket.localAddress = address;
675 totalRead += 1; 675 totalRead += 1;
676 lastRead = timestamp; 676 lastRead = timestamp;
677 return socket; 677 return socket;
678 } 678 }
679 679
680 int get port { 680 int get port {
681 if (isClosing || isClosed) throw const SocketException.closed();
681 if (localPort != 0) return localPort; 682 if (localPort != 0) return localPort;
682 var result = nativeGetPort(); 683 var result = nativeGetPort();
683 if (result is OSError) throw result; 684 if (result is OSError) throw result;
684 return localPort = result; 685 return localPort = result;
685 } 686 }
686 687
687 int get remotePort { 688 int get remotePort {
688 return nativeGetRemotePeer()[1]; 689 if (isClosing || isClosed) throw const SocketException.closed();
690 var result = nativeGetRemotePeer();
691 if (result is OSError) throw result;
692 return result[1];
693 }
694
695 InternetAddress get address {
Anders Johnsen 2015/03/09 12:00:45 This is a breaking change. Before we allowed the u
Søren Gjesse 2015/03/09 13:33:46 Yes (I had to fix a test), it is the same for port
696 if (isClosing || isClosed) throw const SocketException.closed();
697 return localAddress;
689 } 698 }
690 699
691 InternetAddress get remoteAddress { 700 InternetAddress get remoteAddress {
692 var result = nativeGetRemotePeer()[0]; 701 if (isClosing || isClosed) throw const SocketException.closed();
693 var type = new InternetAddressType._from(result[0]); 702 var result = nativeGetRemotePeer();
694 return new _InternetAddress(result[1], null, result[2]); 703 if (result is OSError) throw result;
704 var addr = result[0];
705 var type = new InternetAddressType._from(addr[0]);
706 return new _InternetAddress(addr[1], null, addr[2]);
695 } 707 }
696 708
697 void issueReadEvent() { 709 void issueReadEvent() {
698 if (closedReadEventSent) return; 710 if (closedReadEventSent) return;
699 if (readEventIssued) return; 711 if (readEventIssued) return;
700 readEventIssued = true; 712 readEventIssued = true;
701 void issue() { 713 void issue() {
702 readEventIssued = false; 714 readEventIssued = false;
703 if (isClosing) return; 715 if (isClosing) return;
704 if (!sendReadEvents) return; 716 if (!sendReadEvents) return;
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 _closeRawSocket(); 1710 _closeRawSocket();
1699 _controllerClosed = true; 1711 _controllerClosed = true;
1700 _controller.close(); 1712 _controller.close();
1701 } 1713 }
1702 1714
1703 bool setOption(SocketOption option, bool enabled) { 1715 bool setOption(SocketOption option, bool enabled) {
1704 if (_raw == null) return false; 1716 if (_raw == null) return false;
1705 return _raw.setOption(option, enabled); 1717 return _raw.setOption(option, enabled);
1706 } 1718 }
1707 1719
1708 int get port => _raw.port; 1720 int get port {
1709 InternetAddress get address => _raw.address; 1721 if (_raw == null) throw const SocketException.closed();;
1710 int get remotePort => _raw.remotePort; 1722 return _raw.port;
1711 InternetAddress get remoteAddress => _raw.remoteAddress; 1723 }
1724
1725 InternetAddress get address {
1726 if (_raw == null) throw const SocketException.closed();;
1727 return _raw.address;
1728 }
1729
1730 int get remotePort {
1731 if (_raw == null) throw const SocketException.closed();;
1732 return _raw.remotePort;
1733 }
1734
1735 InternetAddress get remoteAddress {
1736 if (_raw == null) throw const SocketException.closed();;
1737 return _raw.remoteAddress;
1738 }
1712 1739
1713 Future _detachRaw() { 1740 Future _detachRaw() {
1714 _detachReady = new Completer(); 1741 _detachReady = new Completer();
1715 _sink.close(); 1742 _sink.close();
1716 return _detachReady.future.then((_) { 1743 return _detachReady.future.then((_) {
1717 assert(_consumer.buffer == null); 1744 assert(_consumer.buffer == null);
1718 var raw = _raw; 1745 var raw = _raw;
1719 _raw = null; 1746 _raw = null;
1720 return [raw, _subscription]; 1747 return [raw, _subscription];
1721 }); 1748 });
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 String address, 1995 String address,
1969 List<int> in_addr, 1996 List<int> in_addr,
1970 int port) { 1997 int port) {
1971 return new Datagram( 1998 return new Datagram(
1972 data, 1999 data,
1973 new _InternetAddress(address, null, in_addr), 2000 new _InternetAddress(address, null, in_addr),
1974 port); 2001 port);
1975 } 2002 }
1976 2003
1977 String _socketsStats() => _SocketsObservatory.toJSON(); 2004 String _socketsStats() => _SocketsObservatory.toJSON();
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/io/socket.dart » ('j') | tests/standalone/io/raw_socket_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698