| OLD | NEW |
| 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 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 | 306 |
| 307 int tokens = 0; | 307 int tokens = 0; |
| 308 | 308 |
| 309 bool sendReadEvents = false; | 309 bool sendReadEvents = false; |
| 310 bool readEventIssued = false; | 310 bool readEventIssued = false; |
| 311 | 311 |
| 312 bool sendWriteEvents = false; | 312 bool sendWriteEvents = false; |
| 313 bool writeEventIssued = false; | 313 bool writeEventIssued = false; |
| 314 bool writeAvailable = false; | 314 bool writeAvailable = false; |
| 315 | 315 |
| 316 static final Stopwatch sw = new Stopwatch()..start(); | |
| 317 | |
| 318 static bool connectedResourceHandler = false; | 316 static bool connectedResourceHandler = false; |
| 319 _ReadWriteResourceInfo resourceInfo; | 317 _ReadWriteResourceInfo resourceInfo; |
| 320 | 318 |
| 321 // The owner object is the object that the Socket is being used by, e.g. | 319 // The owner object is the object that the Socket is being used by, e.g. |
| 322 // a HttpServer, a WebSocket connection, a process pipe, etc. | 320 // a HttpServer, a WebSocket connection, a process pipe, etc. |
| 323 Object owner; | 321 Object owner; |
| 324 | 322 |
| 325 static double get timestamp => sw.elapsedMicroseconds / 1000000.0; | 323 static double get timestamp => sw.elapsedMicroseconds / 1000000.0; |
| 326 | 324 |
| 327 static Future<List<InternetAddress>> lookup( | 325 static Future<List<InternetAddress>> lookup( |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 available -= result.length; | 575 available -= result.length; |
| 578 // TODO(ricow): Remove when we track internal and pipe uses. | 576 // TODO(ricow): Remove when we track internal and pipe uses. |
| 579 assert(resourceInfo != null || isPipe || isInternal); | 577 assert(resourceInfo != null || isPipe || isInternal); |
| 580 if (resourceInfo != null) { | 578 if (resourceInfo != null) { |
| 581 resourceInfo.totalRead += result.length; | 579 resourceInfo.totalRead += result.length; |
| 582 } | 580 } |
| 583 } | 581 } |
| 584 // TODO(ricow): Remove when we track internal and pipe uses. | 582 // TODO(ricow): Remove when we track internal and pipe uses. |
| 585 assert(resourceInfo != null || isPipe || isInternal); | 583 assert(resourceInfo != null || isPipe || isInternal); |
| 586 if (resourceInfo != null) { | 584 if (resourceInfo != null) { |
| 587 resourceInfo.readCount++; | 585 resourceInfo.didRead(); |
| 588 resourceInfo.lastRead = timestamp; | |
| 589 } | 586 } |
| 590 return result; | 587 return result; |
| 591 } | 588 } |
| 592 | 589 |
| 593 Datagram receive() { | 590 Datagram receive() { |
| 594 if (isClosing || isClosed) return null; | 591 if (isClosing || isClosed) return null; |
| 595 var result = nativeRecvFrom(); | 592 var result = nativeRecvFrom(); |
| 596 if (result is OSError) { | 593 if (result is OSError) { |
| 597 reportError(result, "Receive failed"); | 594 reportError(result, "Receive failed"); |
| 598 return null; | 595 return null; |
| 599 } | 596 } |
| 600 if (result != null) { | 597 if (result != null) { |
| 601 // Read the next available. Available is only for the next datagram, not | 598 // Read the next available. Available is only for the next datagram, not |
| 602 // the sum of all datagrams pending, so we need to call after each | 599 // the sum of all datagrams pending, so we need to call after each |
| 603 // receive. If available becomes > 0, the _NativeSocket will continue to | 600 // receive. If available becomes > 0, the _NativeSocket will continue to |
| 604 // emit read events. | 601 // emit read events. |
| 605 available = nativeAvailable(); | 602 available = nativeAvailable(); |
| 606 // TODO(ricow): Remove when we track internal and pipe uses. | 603 // TODO(ricow): Remove when we track internal and pipe uses. |
| 607 assert(resourceInfo != null || isPipe || isInternal); | 604 assert(resourceInfo != null || isPipe || isInternal); |
| 608 if (resourceInfo != null) { | 605 if (resourceInfo != null) { |
| 609 resourceInfo.totalRead += result.data.length; | 606 resourceInfo.totalRead += result.data.length; |
| 610 } | 607 } |
| 611 } | 608 } |
| 612 // TODO(ricow): Remove when we track internal and pipe uses. | 609 // TODO(ricow): Remove when we track internal and pipe uses. |
| 613 assert(resourceInfo != null || isPipe || isInternal); | 610 assert(resourceInfo != null || isPipe || isInternal); |
| 614 if (resourceInfo != null) { | 611 if (resourceInfo != null) { |
| 615 resourceInfo.readCount++; | 612 resourceInfo.didRead(); |
| 616 resourceInfo.lastRead = timestamp; | |
| 617 } | 613 } |
| 618 return result; | 614 return result; |
| 619 } | 615 } |
| 620 | 616 |
| 621 int write(List<int> buffer, int offset, int bytes) { | 617 int write(List<int> buffer, int offset, int bytes) { |
| 622 if (buffer is! List) throw new ArgumentError(); | 618 if (buffer is! List) throw new ArgumentError(); |
| 623 if (offset == null) offset = 0; | 619 if (offset == null) offset = 0; |
| 624 if (bytes == null) { | 620 if (bytes == null) { |
| 625 if (offset > buffer.length) { | 621 if (offset > buffer.length) { |
| 626 throw new RangeError.value(offset); | 622 throw new RangeError.value(offset); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 649 // purpose. In such case, don't mark writeAvailable as false, as we don't | 645 // purpose. In such case, don't mark writeAvailable as false, as we don't |
| 650 // know if we'll receive an event. It's better to just retry. | 646 // know if we'll receive an event. It's better to just retry. |
| 651 if (result >= 0 && result < bytes) { | 647 if (result >= 0 && result < bytes) { |
| 652 writeAvailable = false; | 648 writeAvailable = false; |
| 653 } | 649 } |
| 654 // Negate the result, as stated above. | 650 // Negate the result, as stated above. |
| 655 if (result < 0) result = -result; | 651 if (result < 0) result = -result; |
| 656 // TODO(ricow): Remove when we track internal and pipe uses. | 652 // TODO(ricow): Remove when we track internal and pipe uses. |
| 657 assert(resourceInfo != null || isPipe || isInternal); | 653 assert(resourceInfo != null || isPipe || isInternal); |
| 658 if (resourceInfo != null) { | 654 if (resourceInfo != null) { |
| 659 resourceInfo.totalWritten += result; | 655 resourceInfo.addWrite(result); |
| 660 resourceInfo.writeCount++; | |
| 661 resourceInfo.lastWrite = timestamp; | |
| 662 } | 656 } |
| 663 return result; | 657 return result; |
| 664 } | 658 } |
| 665 | 659 |
| 666 int send(List<int> buffer, int offset, int bytes, | 660 int send(List<int> buffer, int offset, int bytes, |
| 667 InternetAddress address, int port) { | 661 InternetAddress address, int port) { |
| 668 if (isClosing || isClosed) return 0; | 662 if (isClosing || isClosed) return 0; |
| 669 _BufferAndStart bufferAndStart = | 663 _BufferAndStart bufferAndStart = |
| 670 _ensureFastAndSerializableByteData( | 664 _ensureFastAndSerializableByteData( |
| 671 buffer, offset, bytes); | 665 buffer, offset, bytes); |
| 672 var result = nativeSendTo( | 666 var result = nativeSendTo( |
| 673 bufferAndStart.buffer, bufferAndStart.start, bytes, | 667 bufferAndStart.buffer, bufferAndStart.start, bytes, |
| 674 address._in_addr, port); | 668 address._in_addr, port); |
| 675 if (result is OSError) { | 669 if (result is OSError) { |
| 676 scheduleMicrotask(() => reportError(result, "Send failed")); | 670 scheduleMicrotask(() => reportError(result, "Send failed")); |
| 677 result = 0; | 671 result = 0; |
| 678 } | 672 } |
| 679 // TODO(ricow): Remove when we track internal and pipe uses. | 673 // TODO(ricow): Remove when we track internal and pipe uses. |
| 680 assert(resourceInfo != null || isPipe || isInternal); | 674 assert(resourceInfo != null || isPipe || isInternal); |
| 681 if (resourceInfo != null) { | 675 if (resourceInfo != null) { |
| 682 resourceInfo.totalWritten += result; | 676 resourceInfo.addWrite(result); |
| 683 resourceInfo.writeCount++; | |
| 684 resourceInfo.lastWrite = timestamp; | |
| 685 } | 677 } |
| 686 return result; | 678 return result; |
| 687 } | 679 } |
| 688 | 680 |
| 689 _NativeSocket accept() { | 681 _NativeSocket accept() { |
| 690 // Don't issue accept if we're closing. | 682 // Don't issue accept if we're closing. |
| 691 if (isClosing || isClosed) return null; | 683 if (isClosing || isClosed) return null; |
| 692 assert(available > 0); | 684 assert(available > 0); |
| 693 available--; | 685 available--; |
| 694 tokens++; | 686 tokens++; |
| 695 returnTokens(LISTENING_TOKEN_BATCH_SIZE); | 687 returnTokens(LISTENING_TOKEN_BATCH_SIZE); |
| 696 var socket = new _NativeSocket.normal(); | 688 var socket = new _NativeSocket.normal(); |
| 697 if (nativeAccept(socket) != true) return null; | 689 if (nativeAccept(socket) != true) return null; |
| 698 socket.localPort = localPort; | 690 socket.localPort = localPort; |
| 699 socket.localAddress = address; | 691 socket.localAddress = address; |
| 700 setupResourceInfo(socket); | 692 setupResourceInfo(socket); |
| 701 // TODO(ricow): Remove when we track internal and pipe uses. | 693 // TODO(ricow): Remove when we track internal and pipe uses. |
| 702 assert(resourceInfo != null || isPipe || isInternal); | 694 assert(resourceInfo != null || isPipe || isInternal); |
| 703 if (resourceInfo != null) { | 695 if (resourceInfo != null) { |
| 704 resourceInfo.totalRead += 1; | 696 // We track this as read one byte. |
| 705 resourceInfo.lastRead = timestamp; | 697 resourceInfo.addRead(1); |
| 706 } | 698 } |
| 707 return socket; | 699 return socket; |
| 708 } | 700 } |
| 709 | 701 |
| 710 int get port { | 702 int get port { |
| 711 if (localPort != 0) return localPort; | 703 if (localPort != 0) return localPort; |
| 712 if (isClosing || isClosed) throw const SocketException.closed(); | 704 if (isClosing || isClosed) throw const SocketException.closed(); |
| 713 var result = nativeGetPort(); | 705 var result = nativeGetPort(); |
| 714 if (result is OSError) throw result; | 706 if (result is OSError) throw result; |
| 715 return localPort = result; | 707 return localPort = result; |
| (...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1909 Datagram _makeDatagram(List<int> data, | 1901 Datagram _makeDatagram(List<int> data, |
| 1910 String address, | 1902 String address, |
| 1911 List<int> in_addr, | 1903 List<int> in_addr, |
| 1912 int port) { | 1904 int port) { |
| 1913 return new Datagram( | 1905 return new Datagram( |
| 1914 data, | 1906 data, |
| 1915 new _InternetAddress(address, null, in_addr), | 1907 new _InternetAddress(address, null, in_addr), |
| 1916 port); | 1908 port); |
| 1917 } | 1909 } |
| 1918 | 1910 |
| OLD | NEW |