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

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

Issue 8399039: Explicitly handle listen sockets and connection sockets differently in Linux and Mac OS eventhandler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix Mac OS build Created 9 years, 1 month 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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 5
6 class _SocketBase { 6 class _SocketBase {
7 7
8 /* 8 /*
9 * Keep these constants in sync with the native poll event identifiers. 9 * Keep these constants in sync with the native poll event identifiers.
10 */ 10 */
11 static final int _IN_EVENT = 0; 11 static final int _IN_EVENT = 0;
12 static final int _OUT_EVENT = 1; 12 static final int _OUT_EVENT = 1;
13 static final int _ERROR_EVENT = 2; 13 static final int _ERROR_EVENT = 2;
14 static final int _CLOSE_EVENT = 3; 14 static final int _CLOSE_EVENT = 3;
15 static final int _FIRST_EVENT = _IN_EVENT; 15 static final int _FIRST_EVENT = _IN_EVENT;
16 static final int _LAST_EVENT = _CLOSE_EVENT; 16 static final int _LAST_EVENT = _CLOSE_EVENT;
17 17
18 static final int _CLOSE_COMMAND = 4; 18 static final int _CLOSE_COMMAND = 8;
19
20 static final int _LISTEN_SOCKET = 16;
19 21
20 _SocketBase () { 22 _SocketBase () {
21 _handler = new ReceivePort(); 23 _handler = new ReceivePort();
22 _handlerMap = new List(_CLOSE_EVENT + 1); 24 _handlerMap = new List(_CLOSE_EVENT + 1);
23 _handlerMask = 0; 25 _handlerMask = 0;
24 _canActivateHandlers = true; 26 _canActivateHandlers = true;
25 _id = -1; 27 _id = -1;
26 _handler.receive((var message, ignored) { 28 _handler.receive((var message, ignored) {
27 _multiplex(message); 29 _multiplex(message);
28 }); 30 });
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 } 67 }
66 68
67 void _getPort() native "Socket_GetPort"; 69 void _getPort() native "Socket_GetPort";
68 70
69 void setErrorHandler(void callback()) { 71 void setErrorHandler(void callback()) {
70 _setHandler(_ERROR_EVENT, callback); 72 _setHandler(_ERROR_EVENT, callback);
71 } 73 }
72 74
73 void _doActivateHandlers() { 75 void _doActivateHandlers() {
74 if (_canActivateHandlers && (_id >= 0)) { 76 if (_canActivateHandlers && (_id >= 0)) {
75 EventHandler._sendData(_id, _handler, _handlerMask); 77 int data = _handlerMask;
78 if (_isListenSocket()) data |= (1 << _LISTEN_SOCKET);
79 EventHandler._sendData(_id, _handler, data);
76 } 80 }
77 } 81 }
78 82
79 void _scheduleEvent(int event) { 83 void _scheduleEvent(int event) {
80 _handler.toSendPort().send([1 << event], null); 84 _handler.toSendPort().send([1 << event], null);
81 } 85 }
82 86
83 int get port() { 87 int get port() {
84 if (_port == null) { 88 if (_port == null) {
85 _port = _getPort(); 89 _port = _getPort();
(...skipping 13 matching lines...) Expand all
99 if (_handler == null) { 103 if (_handler == null) {
100 throw new 104 throw new
101 SocketIOException("Error: close failed - invalid socket handle"); 105 SocketIOException("Error: close failed - invalid socket handle");
102 } else { 106 } else {
103 _handler.close(); 107 _handler.close();
104 _handler = null; 108 _handler = null;
105 } 109 }
106 } 110 }
107 } 111 }
108 112
113 abstract bool _isListenSocket();
109 114
110 /* 115 /*
111 * Socket id is set from native. -1 indicates that the socket was closed. 116 * Socket id is set from native. -1 indicates that the socket was closed.
112 */ 117 */
113 int _id; 118 int _id;
114 119
115 /* 120 /*
116 * Dedicated ReceivePort for socket events. 121 * Dedicated ReceivePort for socket events.
117 */ 122 */
118 ReceivePort _handler; 123 ReceivePort _handler;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 } 178 }
174 179
175 bool _accept(Socket socket) native "ServerSocket_Accept"; 180 bool _accept(Socket socket) native "ServerSocket_Accept";
176 181
177 bool _createBindListen(String bindAddress, int port, int backlog) 182 bool _createBindListen(String bindAddress, int port, int backlog)
178 native "ServerSocket_CreateBindListen"; 183 native "ServerSocket_CreateBindListen";
179 184
180 void setConnectionHandler(void callback()) { 185 void setConnectionHandler(void callback()) {
181 _setHandler(_IN_EVENT, callback); 186 _setHandler(_IN_EVENT, callback);
182 } 187 }
188
189 bool _isListenSocket() => true;
183 } 190 }
184 191
185 192
186 class _Socket extends _SocketBase implements Socket { 193 class _Socket extends _SocketBase implements Socket {
187 /* 194 /*
188 * Constructor for socket. First a socket object is allocated 195 * Constructor for socket. First a socket object is allocated
189 * in which the native socket is stored. After that _createConnect is 196 * in which the native socket is stored. After that _createConnect is
190 * called which creates a file discriptor and connects to the given 197 * called which creates a file discriptor and connects to the given
191 * host on the given port. Null is returned if file descriptor creation 198 * host on the given port. Null is returned if file descriptor creation
192 * or connect failsed 199 * or connect failsed
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 } 275 }
269 276
270 void setDataHandler(void callback()) { 277 void setDataHandler(void callback()) {
271 _setHandler(_IN_EVENT, callback); 278 _setHandler(_IN_EVENT, callback);
272 } 279 }
273 280
274 void setCloseHandler(void callback()) { 281 void setCloseHandler(void callback()) {
275 _setHandler(_CLOSE_EVENT, callback); 282 _setHandler(_CLOSE_EVENT, callback);
276 } 283 }
277 284
285 bool _isListenSocket() => false;
286
278 InputStream get inputStream() { 287 InputStream get inputStream() {
279 if (_inputStream == null) { 288 if (_inputStream == null) {
280 _inputStream = new SocketInputStream(this); 289 _inputStream = new SocketInputStream(this);
281 } 290 }
282 return _inputStream; 291 return _inputStream;
283 } 292 }
284 293
285 OutputStream get outputStream() { 294 OutputStream get outputStream() {
286 if (_outputStream == null) { 295 if (_outputStream == null) {
287 _outputStream = new SocketOutputStream(this); 296 _outputStream = new SocketOutputStream(this);
288 } 297 }
289 return _outputStream; 298 return _outputStream;
290 } 299 }
291 300
292 SocketInputStream _inputStream; 301 SocketInputStream _inputStream;
293 SocketOutputStream _outputStream; 302 SocketOutputStream _outputStream;
294 } 303 }
295 304
OLDNEW
« runtime/bin/eventhandler_linux.cc ('K') | « runtime/bin/eventhandler_macos.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698