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

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

Issue 879353003: Introduce optional 'bool shared' parameter to ServerSocket.bind() ... (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 5 years, 10 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
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 bool shared: false}) {
11 return _RawServerSocket.bind(address, port, backlog, v6Only, shared);
11 } 12 }
12 } 13 }
13 14
14 15
15 patch class RawSocket { 16 patch class RawSocket {
16 /* patch */ static Future<RawSocket> connect(host, int port) { 17 /* patch */ static Future<RawSocket> connect(host, int port) {
17 return _RawSocket.connect(host, port); 18 return _RawSocket.connect(host, port);
18 } 19 }
19 } 20 }
20 21
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 } 453 }
453 } 454 }
454 connectNext(); 455 connectNext();
455 return completer.future; 456 return completer.future;
456 }); 457 });
457 } 458 }
458 459
459 static Future<_NativeSocket> bind(host, 460 static Future<_NativeSocket> bind(host,
460 int port, 461 int port,
461 int backlog, 462 int backlog,
462 bool v6Only) { 463 bool v6Only,
464 bool shared) {
463 return new Future.value(host) 465 return new Future.value(host)
464 .then((host) { 466 .then((host) {
465 if (host is _InternetAddress) return host; 467 if (host is _InternetAddress) return host;
466 return lookup(host) 468 return lookup(host)
467 .then((list) { 469 .then((list) {
468 if (list.length == 0) { 470 if (list.length == 0) {
469 throw createError(response, "Failed host lookup: '$host'"); 471 throw createError(response, "Failed host lookup: '$host'");
470 } 472 }
471 return list[0]; 473 return list[0];
472 }); 474 });
473 }) 475 })
474 .then((address) { 476 .then((address) {
475 var socket = new _NativeSocket.listen(); 477 var socket = new _NativeSocket.listen();
476 socket.address = address; 478 socket.address = address;
479
477 var result = socket.nativeCreateBindListen(address._in_addr, 480 var result = socket.nativeCreateBindListen(address._in_addr,
478 port, 481 port,
479 backlog, 482 backlog,
480 v6Only); 483 v6Only,
484 shared);
481 if (result is OSError) { 485 if (result is OSError) {
482 throw new SocketException("Failed to create server socket", 486 throw new SocketException("Failed to create server socket",
483 osError: result, 487 osError: result,
484 address: address, 488 address: address,
485 port: port); 489 port: port);
486 } 490 }
487 if (port != 0) socket.localPort = port; 491 if (port != 0) socket.localPort = port;
488 socket.connectToEventHandler(); 492 socket.connectToEventHandler();
489 return socket; 493 return socket;
490 }); 494 });
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 nativeAvailable() native "Socket_Available"; 1110 nativeAvailable() native "Socket_Available";
1107 nativeRead(int len) native "Socket_Read"; 1111 nativeRead(int len) native "Socket_Read";
1108 nativeRecvFrom() native "Socket_RecvFrom"; 1112 nativeRecvFrom() native "Socket_RecvFrom";
1109 nativeWrite(List<int> buffer, int offset, int bytes) 1113 nativeWrite(List<int> buffer, int offset, int bytes)
1110 native "Socket_WriteList"; 1114 native "Socket_WriteList";
1111 nativeSendTo(List<int> buffer, int offset, int bytes, 1115 nativeSendTo(List<int> buffer, int offset, int bytes,
1112 List<int> address, int port) 1116 List<int> address, int port)
1113 native "Socket_SendTo"; 1117 native "Socket_SendTo";
1114 nativeCreateConnect(List<int> addr, 1118 nativeCreateConnect(List<int> addr,
1115 int port) native "Socket_CreateConnect"; 1119 int port) native "Socket_CreateConnect";
1116 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only) 1120 nativeCreateBindListen(List<int> addr, int port, int backlog, bool v6Only,
1121 bool shared)
1117 native "ServerSocket_CreateBindListen"; 1122 native "ServerSocket_CreateBindListen";
1118 nativeCreateBindDatagram(List<int> addr, int port, bool reuseAddress) 1123 nativeCreateBindDatagram(List<int> addr, int port, bool reuseAddress)
1119 native "Socket_CreateBindDatagram"; 1124 native "Socket_CreateBindDatagram";
1120 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept"; 1125 nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
1121 int nativeGetPort() native "Socket_GetPort"; 1126 int nativeGetPort() native "Socket_GetPort";
1122 List nativeGetRemotePeer() native "Socket_GetRemotePeer"; 1127 List nativeGetRemotePeer() native "Socket_GetRemotePeer";
1123 int nativeGetSocketId() native "Socket_GetSocketId"; 1128 int nativeGetSocketId() native "Socket_GetSocketId";
1124 OSError nativeGetError() native "Socket_GetError"; 1129 OSError nativeGetError() native "Socket_GetError";
1125 nativeGetOption(int option, int protocol) native "Socket_GetOption"; 1130 nativeGetOption(int option, int protocol) native "Socket_GetOption";
1126 bool nativeSetOption(int option, int protocol, value) 1131 bool nativeSetOption(int option, int protocol, value)
1127 native "Socket_SetOption"; 1132 native "Socket_SetOption";
1128 bool nativeJoinMulticast( 1133 bool nativeJoinMulticast(
1129 List<int> addr, List<int> interfaceAddr, int interfaceIndex) 1134 List<int> addr, List<int> interfaceAddr, int interfaceIndex)
1130 native "Socket_JoinMulticast"; 1135 native "Socket_JoinMulticast";
1131 bool nativeLeaveMulticast( 1136 bool nativeLeaveMulticast(
1132 List<int> addr, List<int> interfaceAddr, int interfaceIndex) 1137 List<int> addr, List<int> interfaceAddr, int interfaceIndex)
1133 native "Socket_LeaveMulticast"; 1138 native "Socket_LeaveMulticast";
1139 bool _nativeMarkSocketAsSharedHack()
1140 native "Socket_MarkSocketAsSharedHack";
1134 } 1141 }
1135 1142
1136 1143
1137 class _RawServerSocket extends Stream<RawSocket> 1144 class _RawServerSocket extends Stream<RawSocket>
1138 implements RawServerSocket { 1145 implements RawServerSocket {
1139 final _NativeSocket _socket; 1146 final _NativeSocket _socket;
1140 StreamController<RawSocket> _controller; 1147 StreamController<RawSocket> _controller;
1141 ReceivePort _referencePort; 1148 ReceivePort _referencePort;
1149 bool _v6Only;
1142 1150
1143 static Future<_RawServerSocket> bind(address, 1151 static Future<_RawServerSocket> bind(address,
1144 int port, 1152 int port,
1145 int backlog, 1153 int backlog,
1146 bool v6Only) { 1154 bool v6Only,
1155 bool shared) {
1147 if (port < 0 || port > 0xFFFF) 1156 if (port < 0 || port > 0xFFFF)
1148 throw new ArgumentError("Invalid port $port"); 1157 throw new ArgumentError("Invalid port $port");
1149 if (backlog < 0) throw new ArgumentError("Invalid backlog $backlog"); 1158 if (backlog < 0) throw new ArgumentError("Invalid backlog $backlog");
1150 return _NativeSocket.bind(address, port, backlog, v6Only) 1159 return _NativeSocket.bind(address, port, backlog, v6Only, shared)
1151 .then((socket) => new _RawServerSocket(socket)); 1160 .then((socket) => new _RawServerSocket(socket, v6Only));
1152 } 1161 }
1153 1162
1154 _RawServerSocket(this._socket); 1163 _RawServerSocket(this._socket, this._v6Only);
1155 1164
1156 StreamSubscription<RawSocket> listen(void onData(RawSocket event), 1165 StreamSubscription<RawSocket> listen(void onData(RawSocket event),
1157 {Function onError, 1166 {Function onError,
1158 void onDone(), 1167 void onDone(),
1159 bool cancelOnError}) { 1168 bool cancelOnError}) {
1160 if (_controller != null) { 1169 if (_controller != null) {
1161 throw new StateError("Stream was already listened to"); 1170 throw new StateError("Stream was already listened to");
1162 } 1171 }
1163 var zone = Zone.current; 1172 var zone = Zone.current;
1164 _controller = new StreamController(sync: true, 1173 _controller = new StreamController(sync: true,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 void _onPauseStateChange() { 1235 void _onPauseStateChange() {
1227 if (_controller.isPaused) { 1236 if (_controller.isPaused) {
1228 _pause(); 1237 _pause();
1229 } else { 1238 } else {
1230 _resume(); 1239 _resume();
1231 } 1240 }
1232 } 1241 }
1233 1242
1234 RawServerSocketReference get reference { 1243 RawServerSocketReference get reference {
1235 if (_referencePort == null) { 1244 if (_referencePort == null) {
1245 bool successfull = _socket._nativeMarkSocketAsSharedHack();
1236 _referencePort = new ReceivePort(); 1246 _referencePort = new ReceivePort();
1237 _referencePort.listen((sendPort) { 1247 _referencePort.listen((sendPort) {
1238 sendPort.send( 1248 sendPort.send(
1239 [_socket.nativeGetSocketId(), 1249 [_socket.address,
1240 _socket.address, 1250 _socket.port,
1241 _socket.localPort]); 1251 _v6Only]);
1242 }); 1252 });
1243 } 1253 }
1244 return new _RawServerSocketReference(_referencePort.sendPort); 1254 return new _RawServerSocketReference(_referencePort.sendPort);
1245 } 1255 }
1246 1256
1247 Map _toJSON(bool ref) => _socket._toJSON(ref); 1257 Map _toJSON(bool ref) => _socket._toJSON(ref);
1258
1248 void set _owner(owner) { _socket.owner = owner; } 1259 void set _owner(owner) { _socket.owner = owner; }
1249 } 1260 }
1250 1261
1251 1262
1252 class _RawServerSocketReference implements RawServerSocketReference { 1263 class _RawServerSocketReference implements RawServerSocketReference {
1253 final SendPort _sendPort; 1264 final SendPort _sendPort;
1254 1265
1255 _RawServerSocketReference(this._sendPort); 1266 _RawServerSocketReference(this._sendPort);
1256 1267
1257 Future<RawServerSocket> create() { 1268 Future<RawServerSocket> create() {
1258 var port = new ReceivePort(); 1269 var port = new ReceivePort();
1259 _sendPort.send(port.sendPort); 1270 _sendPort.send(port.sendPort);
1260 return port.first.then((args) { 1271 return port.first.then((List args) {
1261 port.close(); 1272 port.close();
1262 var native = new _NativeSocket.listen(); 1273
1263 native.nativeSetSocketId(args[0]); 1274 InternetAddress address = args[0];
1264 native.address = args[1]; 1275 int tcpPort = args[1];
1265 native.localPort = args[2]; 1276 bool v6Only = args[2];
1266 return new _RawServerSocket(native); 1277 return
1278 RawServerSocket.bind(address, tcpPort, v6Only: v6Only, shared: true);
1267 }); 1279 });
1268 } 1280 }
1269 1281
1270 int get hashCode => _sendPort.hashCode; 1282 int get hashCode => _sendPort.hashCode;
1271 1283
1272 bool operator==(Object other) 1284 bool operator==(Object other)
1273 => other is _RawServerSocketReference && _sendPort == other._sendPort; 1285 => other is _RawServerSocketReference && _sendPort == other._sendPort;
1274 } 1286 }
1275 1287
1276 1288
1277 class _RawSocket extends Stream<RawSocketEvent> 1289 class _RawSocket extends Stream<RawSocketEvent>
1278 implements RawSocket { 1290 implements RawSocket {
1279 final _NativeSocket _socket; 1291 final _NativeSocket _socket;
1280 StreamController<RawSocketEvent> _controller; 1292 StreamController<RawSocketEvent> _controller;
1281 bool _readEventsEnabled = true; 1293 bool _readEventsEnabled = true;
1282 bool _writeEventsEnabled = true; 1294 bool _writeEventsEnabled = true;
1283 1295
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 1434
1423 Map _toJSON(bool ref) => _socket._toJSON(ref); 1435 Map _toJSON(bool ref) => _socket._toJSON(ref);
1424 void set _owner(owner) { _socket.owner = owner; } 1436 void set _owner(owner) { _socket.owner = owner; }
1425 } 1437 }
1426 1438
1427 1439
1428 patch class ServerSocket { 1440 patch class ServerSocket {
1429 /* patch */ static Future<ServerSocket> bind(address, 1441 /* patch */ static Future<ServerSocket> bind(address,
1430 int port, 1442 int port,
1431 {int backlog: 0, 1443 {int backlog: 0,
1432 bool v6Only: false}) { 1444 bool v6Only: false,
1433 return _ServerSocket.bind(address, port, backlog, v6Only); 1445 bool shared: false}) {
1446 return _ServerSocket.bind(address, port, backlog, v6Only, shared);
1434 } 1447 }
1435 } 1448 }
1436 1449
1437 1450
1438 class _ServerSocketReference implements ServerSocketReference { 1451 class _ServerSocketReference implements ServerSocketReference {
1439 final RawServerSocketReference _rawReference; 1452 final RawServerSocketReference _rawReference;
1440 1453
1441 _ServerSocketReference(this._rawReference); 1454 _ServerSocketReference(this._rawReference);
1442 1455
1443 Future<ServerSocket> create() { 1456 Future<ServerSocket> create() {
1444 return _rawReference.create().then((raw) => new _ServerSocket(raw)); 1457 return _rawReference.create().then((raw) => new _ServerSocket(raw));
1445 } 1458 }
1446 } 1459 }
1447 1460
1448 1461
1449 class _ServerSocket extends Stream<Socket> 1462 class _ServerSocket extends Stream<Socket>
1450 implements ServerSocket { 1463 implements ServerSocket {
1451 final _socket; 1464 final _socket;
1452 1465
1453 static Future<_ServerSocket> bind(address, 1466 static Future<_ServerSocket> bind(address,
1454 int port, 1467 int port,
1455 int backlog, 1468 int backlog,
1456 bool v6Only) { 1469 bool v6Only,
1457 return _RawServerSocket.bind(address, port, backlog, v6Only) 1470 bool shared) {
1471 return _RawServerSocket.bind(address, port, backlog, v6Only, shared)
1458 .then((socket) => new _ServerSocket(socket)); 1472 .then((socket) => new _ServerSocket(socket));
1459 } 1473 }
1460 1474
1461 _ServerSocket(this._socket); 1475 _ServerSocket(this._socket);
1462 1476
1463 StreamSubscription<Socket> listen(void onData(Socket event), 1477 StreamSubscription<Socket> listen(void onData(Socket event),
1464 {Function onError, 1478 {Function onError,
1465 void onDone(), 1479 void onDone(),
1466 bool cancelOnError}) { 1480 bool cancelOnError}) {
1467 return _socket.map((rawSocket) => new _Socket(rawSocket)).listen( 1481 return _socket.map((rawSocket) => new _Socket(rawSocket)).listen(
1468 onData, 1482 onData,
1469 onError: onError, 1483 onError: onError,
1470 onDone: onDone, 1484 onDone: onDone,
1471 cancelOnError: cancelOnError); 1485 cancelOnError: cancelOnError);
1472 } 1486 }
1473 1487
1474 int get port => _socket.port; 1488 int get port => _socket.port;
1475 1489
1476 InternetAddress get address => _socket.address; 1490 InternetAddress get address => _socket.address;
1477 1491
1478 Future close() => _socket.close().then((_) => this); 1492 Future close() => _socket.close().then((_) => this);
1479 1493
1480 ServerSocketReference get reference { 1494 ServerSocketReference get reference {
1481 return new _ServerSocketReference(_socket.reference); 1495 return new _ServerSocketReference(_socket.reference);
1482 } 1496 }
1483 1497
1484 Map _toJSON(bool ref) => _socket._toJSON(ref); 1498 Map _toJSON(bool ref) => _socket._toJSON(ref);
1499
1485 void set _owner(owner) { _socket._owner = owner; } 1500 void set _owner(owner) { _socket._owner = owner; }
1486 } 1501 }
1487 1502
1488 1503
1489 patch class Socket { 1504 patch class Socket {
1490 /* patch */ static Future<Socket> connect(host, int port) { 1505 /* patch */ static Future<Socket> connect(host, int port) {
1491 return RawSocket.connect(host, port).then( 1506 return RawSocket.connect(host, port).then(
1492 (socket) => new _Socket(socket)); 1507 (socket) => new _Socket(socket));
1493 } 1508 }
1494 } 1509 }
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1930 String address, 1945 String address,
1931 List<int> in_addr, 1946 List<int> in_addr,
1932 int port) { 1947 int port) {
1933 return new Datagram( 1948 return new Datagram(
1934 data, 1949 data,
1935 new _InternetAddress(address, null, in_addr), 1950 new _InternetAddress(address, null, in_addr),
1936 port); 1951 port);
1937 } 1952 }
1938 1953
1939 String _socketsStats() => _SocketsObservatory.toJSON(); 1954 String _socketsStats() => _SocketsObservatory.toJSON();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698