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

Side by Side Diff: dart/runtime/bin/eventhandler_win.h

Issue 896213002: Revert "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
« no previous file with comments | « dart/runtime/bin/eventhandler_macos.cc ('k') | dart/runtime/bin/eventhandler_win.cc » ('j') | 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 #ifndef BIN_EVENTHANDLER_WIN_H_ 5 #ifndef BIN_EVENTHANDLER_WIN_H_
6 #define BIN_EVENTHANDLER_WIN_H_ 6 #define BIN_EVENTHANDLER_WIN_H_
7 7
8 #if !defined(BIN_EVENTHANDLER_H_) 8 #if !defined(BIN_EVENTHANDLER_H_)
9 #error Do not include eventhandler_win.h directly; use eventhandler.h instead. 9 #error Do not include eventhandler_win.h directly; use eventhandler.h instead.
10 #endif 10 #endif
(...skipping 11 matching lines...) Expand all
22 22
23 // Forward declarations. 23 // Forward declarations.
24 class EventHandlerImplementation; 24 class EventHandlerImplementation;
25 class Handle; 25 class Handle;
26 class FileHandle; 26 class FileHandle;
27 class SocketHandle; 27 class SocketHandle;
28 class ClientSocket; 28 class ClientSocket;
29 class ListenSocket; 29 class ListenSocket;
30 30
31 31
32 struct InterruptMessage {
33 intptr_t id;
34 Dart_Port dart_port;
35 int64_t data;
36 };
37
38
32 // An OverlappedBuffer encapsulates the OVERLAPPED structure and the 39 // An OverlappedBuffer encapsulates the OVERLAPPED structure and the
33 // associated data buffer. For accept it also contains the pre-created 40 // associated data buffer. For accept it also contains the pre-created
34 // socket for the client. 41 // socket for the client.
35 class OverlappedBuffer { 42 class OverlappedBuffer {
36 public: 43 public:
37 enum Operation { 44 enum Operation {
38 kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect, kConnect 45 kAccept, kRead, kRecvFrom, kWrite, kSendTo, kDisconnect, kConnect
39 }; 46 };
40 47
41 static OverlappedBuffer* AllocateAcceptBuffer(int buffer_size); 48 static OverlappedBuffer* AllocateAcceptBuffer(int buffer_size);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 154
148 // Buffer for recv/send/AcceptEx. This must be at the end of the 155 // Buffer for recv/send/AcceptEx. This must be at the end of the
149 // object as the object is allocated larger than it's definition 156 // object as the object is allocated larger than it's definition
150 // indicate to extend this array. 157 // indicate to extend this array.
151 uint8_t buffer_data_[1]; 158 uint8_t buffer_data_[1];
152 }; 159 };
153 160
154 161
155 // Abstract super class for holding information on listen and connected 162 // Abstract super class for holding information on listen and connected
156 // sockets. 163 // sockets.
157 class Handle : public DescriptorInfoBase { 164 class Handle {
158 public: 165 public:
159 enum Type { 166 enum Type {
160 kFile, 167 kFile,
161 kStd, 168 kStd,
162 kDirectoryWatch, 169 kDirectoryWatch,
163 kClientSocket, 170 kClientSocket,
164 kListenSocket, 171 kListenSocket,
165 kDatagramSocket 172 kDatagramSocket
166 }; 173 };
167 174
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 bool IsError() { return (flags_ & (1 << kError)) != 0; } 218 bool IsError() { return (flags_ & (1 << kError)) != 0; }
212 void MarkClosing() { flags_ |= (1 << kClosing); } 219 void MarkClosing() { flags_ |= (1 << kClosing); }
213 void MarkClosedRead() { flags_ |= (1 << kCloseRead); } 220 void MarkClosedRead() { flags_ |= (1 << kCloseRead); }
214 void MarkClosedWrite() { flags_ |= (1 << kCloseWrite); } 221 void MarkClosedWrite() { flags_ |= (1 << kCloseWrite); }
215 void MarkError() { flags_ |= (1 << kError); } 222 void MarkError() { flags_ |= (1 << kError); }
216 223
217 virtual void EnsureInitialized( 224 virtual void EnsureInitialized(
218 EventHandlerImplementation* event_handler) = 0; 225 EventHandlerImplementation* event_handler) = 0;
219 226
220 HANDLE handle() { return handle_; } 227 HANDLE handle() { return handle_; }
228 Dart_Port port() { return port_; }
221 229
222 void Lock(); 230 void Lock();
223 void Unlock(); 231 void Unlock();
224 232
225 bool CreateCompletionPort(HANDLE completion_port); 233 bool CreateCompletionPort(HANDLE completion_port);
226 234
227 void Close(); 235 void Close();
228 virtual void DoClose(); 236 virtual void DoClose();
229 virtual bool IsClosed() = 0; 237 virtual bool IsClosed() = 0;
230 238
231 bool IsHandleClosed() const { return handle_ == INVALID_HANDLE_VALUE; } 239 bool IsHandleClosed() const { return handle_ == INVALID_HANDLE_VALUE; }
232 240
241 void SetPortAndMask(Dart_Port port, intptr_t mask) {
242 port_ = port;
243 mask_ = mask;
244 }
233 Type type() { return type_; } 245 Type type() { return type_; }
234 bool is_file() { return type_ == kFile; } 246 bool is_file() { return type_ == kFile; }
235 bool is_socket() { return type_ == kListenSocket || 247 bool is_socket() { return type_ == kListenSocket ||
236 type_ == kClientSocket || 248 type_ == kClientSocket ||
237 type_ == kDatagramSocket; } 249 type_ == kDatagramSocket; }
238 bool is_listen_socket() { return type_ == kListenSocket; } 250 bool is_listen_socket() { return type_ == kListenSocket; }
239 bool is_client_socket() { return type_ == kClientSocket; } 251 bool is_client_socket() { return type_ == kClientSocket; }
240 bool is_datagram_socket() { return type_ == kDatagramSocket; } 252 bool is_datagram_socket() { return type_ == kDatagramSocket; }
253 void set_mask(intptr_t mask) { mask_ = mask; }
254 intptr_t mask() { return mask_; }
241 255
242 void MarkDoesNotSupportOverlappedIO() { 256 void MarkDoesNotSupportOverlappedIO() {
243 flags_ |= (1 << kDoesNotSupportOverlappedIO); 257 flags_ |= (1 << kDoesNotSupportOverlappedIO);
244 } 258 }
245 bool SupportsOverlappedIO() { 259 bool SupportsOverlappedIO() {
246 return (flags_ & (1 << kDoesNotSupportOverlappedIO)) == 0; 260 return (flags_ & (1 << kDoesNotSupportOverlappedIO)) == 0;
247 } 261 }
248 262
249 void ReadSyncCompleteAsync(); 263 void ReadSyncCompleteAsync();
250 264
251 DWORD last_error() { return last_error_; } 265 DWORD last_error() { return last_error_; }
252 void set_last_error(DWORD last_error) { last_error_ = last_error; } 266 void set_last_error(DWORD last_error) { last_error_ = last_error; }
253 267
254 protected: 268 protected:
255 enum Flags { 269 enum Flags {
256 kClosing = 0, 270 kClosing = 0,
257 kCloseRead = 1, 271 kCloseRead = 1,
258 kCloseWrite = 2, 272 kCloseWrite = 2,
259 kDoesNotSupportOverlappedIO = 3, 273 kDoesNotSupportOverlappedIO = 3,
260 kError = 4 274 kError = 4
261 }; 275 };
262 276
263 explicit Handle(intptr_t handle); 277 explicit Handle(HANDLE handle);
278 Handle(HANDLE handle, Dart_Port port);
264 279
265 virtual void HandleIssueError(); 280 virtual void HandleIssueError();
266 281
267 Type type_; 282 Type type_;
268 HANDLE handle_; 283 HANDLE handle_;
284 Dart_Port port_; // Dart port to communicate events for this socket.
285 intptr_t mask_; // Mask of events to report through the port.
269 HANDLE completion_port_; 286 HANDLE completion_port_;
270 EventHandlerImplementation* event_handler_; 287 EventHandlerImplementation* event_handler_;
271 288
272 OverlappedBuffer* data_ready_; // Buffer for data ready to be read. 289 OverlappedBuffer* data_ready_; // Buffer for data ready to be read.
273 OverlappedBuffer* pending_read_; // Buffer for pending read. 290 OverlappedBuffer* pending_read_; // Buffer for pending read.
274 OverlappedBuffer* pending_write_; // Buffer for pending write 291 OverlappedBuffer* pending_write_; // Buffer for pending write
275 292
276 DWORD last_error_; 293 DWORD last_error_;
277 294
278 private: 295 private:
279 int flags_; 296 int flags_;
280 CRITICAL_SECTION cs_; // Critical section protecting this object. 297 CRITICAL_SECTION cs_; // Critical section protecting this object.
281 }; 298 };
282 299
283 300
284 class FileHandle : public DescriptorInfoSingleMixin<Handle> { 301 class FileHandle : public Handle {
285 public: 302 public:
286 explicit FileHandle(HANDLE handle) 303 explicit FileHandle(HANDLE handle)
287 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle)) { 304 : Handle(handle) { type_ = kFile; }
288 type_ = kFile; 305 FileHandle(HANDLE handle, Dart_Port port)
289 } 306 : Handle(handle, port) { type_ = kFile; }
290 307
291 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); 308 virtual void EnsureInitialized(EventHandlerImplementation* event_handler);
292 virtual bool IsClosed(); 309 virtual bool IsClosed();
293 }; 310 };
294 311
295 312
296 class StdHandle : public FileHandle { 313 class StdHandle : public FileHandle {
297 public: 314 public:
298 explicit StdHandle(HANDLE handle) 315 explicit StdHandle(HANDLE handle)
299 : FileHandle(handle), 316 : FileHandle(handle),
(...skipping 15 matching lines...) Expand all
315 void RunWriteLoop(); 332 void RunWriteLoop();
316 333
317 private: 334 private:
318 intptr_t thread_wrote_; 335 intptr_t thread_wrote_;
319 bool write_thread_exists_; 336 bool write_thread_exists_;
320 bool write_thread_running_; 337 bool write_thread_running_;
321 Monitor* write_monitor_; 338 Monitor* write_monitor_;
322 }; 339 };
323 340
324 341
325 class DirectoryWatchHandle : public DescriptorInfoSingleMixin<Handle> { 342 class DirectoryWatchHandle : public Handle {
326 public: 343 public:
327 DirectoryWatchHandle(HANDLE handle, int events, bool recursive) 344 DirectoryWatchHandle(HANDLE handle, int events, bool recursive)
328 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle)), 345 : Handle(handle),
329 events_(events), 346 events_(events),
330 recursive_(recursive) { 347 recursive_(recursive) {
331 type_ = kDirectoryWatch; 348 type_ = kDirectoryWatch;
332 } 349 }
333 350
334 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); 351 virtual void EnsureInitialized(EventHandlerImplementation* event_handler);
335 virtual bool IsClosed(); 352 virtual bool IsClosed();
336 353
337 virtual bool IssueRead(); 354 virtual bool IssueRead();
338 355
339 void Stop(); 356 void Stop();
340 357
341 private: 358 private:
342 int events_; 359 int events_;
343 bool recursive_; 360 bool recursive_;
344 }; 361 };
345 362
346 363
347 class SocketHandle : public Handle { 364 class SocketHandle : public Handle {
348 public: 365 public:
349 SOCKET socket() const { return socket_; } 366 SOCKET socket() const { return socket_; }
350 367
351 protected: 368 protected:
352 explicit SocketHandle(intptr_t s) 369 explicit SocketHandle(SOCKET s)
353 : Handle(s), 370 : Handle(reinterpret_cast<HANDLE>(s)),
371 socket_(s) {}
372 SocketHandle(SOCKET s, Dart_Port port)
373 : Handle(reinterpret_cast<HANDLE>(s), port),
354 socket_(s) {} 374 socket_(s) {}
355 375
356 virtual void HandleIssueError(); 376 virtual void HandleIssueError();
357 377
358 private: 378 private:
359 const SOCKET socket_; 379 const SOCKET socket_;
360 }; 380 };
361 381
362 382
363 // Information on listen sockets. 383 // Information on listen sockets.
364 class ListenSocket : public DescriptorInfoMultipleMixin<SocketHandle> { 384 class ListenSocket : public SocketHandle {
365 public: 385 public:
366 explicit ListenSocket(intptr_t s) : DescriptorInfoMultipleMixin(s), 386 explicit ListenSocket(SOCKET s) : SocketHandle(s),
367 AcceptEx_(NULL), 387 AcceptEx_(NULL),
368 pending_accept_count_(0), 388 pending_accept_count_(0),
369 accepted_head_(NULL), 389 accepted_head_(NULL),
370 accepted_tail_(NULL), 390 accepted_tail_(NULL) {
371 accepted_count_(0) {
372 type_ = kListenSocket; 391 type_ = kListenSocket;
373 } 392 }
374 virtual ~ListenSocket() { 393 virtual ~ListenSocket() {
375 ASSERT(!HasPendingAccept()); 394 ASSERT(!HasPendingAccept());
376 ASSERT(accepted_head_ == NULL); 395 ASSERT(accepted_head_ == NULL);
377 ASSERT(accepted_tail_ == NULL); 396 ASSERT(accepted_tail_ == NULL);
378 } 397 }
379 398
380 // Socket interface exposing normal socket operations. 399 // Socket interface exposing normal socket operations.
381 ClientSocket* Accept(); 400 ClientSocket* Accept();
382 bool CanAccept(); 401 bool CanAccept();
383 402
384 // Internal interface used by the event handler. 403 // Internal interface used by the event handler.
385 bool HasPendingAccept() { return pending_accept_count_ > 0; } 404 bool HasPendingAccept() { return pending_accept_count_ > 0; }
386 bool IssueAccept(); 405 bool IssueAccept();
387 void AcceptComplete(OverlappedBuffer* buffer, HANDLE completion_port); 406 void AcceptComplete(OverlappedBuffer* buffer, HANDLE completion_port);
388 407
389 virtual void EnsureInitialized( 408 virtual void EnsureInitialized(
390 EventHandlerImplementation* event_handler); 409 EventHandlerImplementation* event_handler);
391 virtual void DoClose(); 410 virtual void DoClose();
392 virtual bool IsClosed(); 411 virtual bool IsClosed();
393 412
394 int pending_accept_count() { return pending_accept_count_; } 413 int pending_accept_count() { return pending_accept_count_; }
395 414
396 int accepted_count() { return accepted_count_; }
397
398 private: 415 private:
399 bool LoadAcceptEx(); 416 bool LoadAcceptEx();
400 417
401 LPFN_ACCEPTEX AcceptEx_; 418 LPFN_ACCEPTEX AcceptEx_;
402
403 // The number of asynchronous `IssueAccept` operations which haven't completed
404 // yet.
405 int pending_accept_count_; 419 int pending_accept_count_;
406
407 // Linked list of accepted connections provided by completion code. Ready to 420 // Linked list of accepted connections provided by completion code. Ready to
408 // be handed over through accept. 421 // be handed over through accept.
409 ClientSocket* accepted_head_; 422 ClientSocket* accepted_head_;
410 ClientSocket* accepted_tail_; 423 ClientSocket* accepted_tail_;
411
412 // The number of accepted connections which are waiting to be removed from
413 // this queue and processed by dart isolates.
414 int accepted_count_;
415 }; 424 };
416 425
417 426
418 // Information on connected sockets. 427 // Information on connected sockets.
419 class ClientSocket : public DescriptorInfoSingleMixin<SocketHandle> { 428 class ClientSocket : public SocketHandle {
420 public: 429 public:
421 explicit ClientSocket(intptr_t s) : DescriptorInfoSingleMixin(s), 430 explicit ClientSocket(SOCKET s) : SocketHandle(s),
422 DisconnectEx_(NULL), 431 DisconnectEx_(NULL),
423 next_(NULL), 432 next_(NULL),
424 connected_(false), 433 connected_(false),
425 closed_(false) { 434 closed_(false) {
426 LoadDisconnectEx(); 435 LoadDisconnectEx();
427 type_ = kClientSocket; 436 type_ = kClientSocket;
428 } 437 }
429 438
439 ClientSocket(SOCKET s, Dart_Port port) : SocketHandle(s, port),
440 DisconnectEx_(NULL),
441 next_(NULL),
442 connected_(false),
443 closed_(false) {
444 LoadDisconnectEx();
445 type_ = kClientSocket;
446 }
447
430 virtual ~ClientSocket() { 448 virtual ~ClientSocket() {
431 // Don't delete this object until all pending requests have been handled. 449 // Don't delete this object until all pending requests have been handled.
432 ASSERT(!HasPendingRead()); 450 ASSERT(!HasPendingRead());
433 ASSERT(!HasPendingWrite()); 451 ASSERT(!HasPendingWrite());
434 ASSERT(next_ == NULL); 452 ASSERT(next_ == NULL);
435 ASSERT(closed_ == true); 453 ASSERT(closed_ == true);
436 } 454 }
437 455
438 void Shutdown(int how); 456 void Shutdown(int how);
439 457
(...skipping 21 matching lines...) Expand all
461 private: 479 private:
462 bool LoadDisconnectEx(); 480 bool LoadDisconnectEx();
463 481
464 LPFN_DISCONNECTEX DisconnectEx_; 482 LPFN_DISCONNECTEX DisconnectEx_;
465 ClientSocket* next_; 483 ClientSocket* next_;
466 bool connected_; 484 bool connected_;
467 bool closed_; 485 bool closed_;
468 }; 486 };
469 487
470 488
471 class DatagramSocket : public DescriptorInfoSingleMixin<SocketHandle> { 489 class DatagramSocket : public SocketHandle {
472 public: 490 public:
473 explicit DatagramSocket(intptr_t s) : DescriptorInfoSingleMixin(s) { 491 explicit DatagramSocket(SOCKET s) : SocketHandle(s) {
474 type_ = kDatagramSocket; 492 type_ = kDatagramSocket;
475 } 493 }
476 494
477 virtual ~DatagramSocket() { 495 virtual ~DatagramSocket() {
478 // Don't delete this object until all pending requests have been handled. 496 // Don't delete this object until all pending requests have been handled.
479 ASSERT(!HasPendingRead()); 497 ASSERT(!HasPendingRead());
480 ASSERT(!HasPendingWrite()); 498 ASSERT(!HasPendingWrite());
481 } 499 }
482 500
483 // Internal interface used by the event handler. 501 // Internal interface used by the event handler.
(...skipping 14 matching lines...) Expand all
498 void SendData(intptr_t id, Dart_Port dart_port, int64_t data); 516 void SendData(intptr_t id, Dart_Port dart_port, int64_t data);
499 void Start(EventHandler* handler); 517 void Start(EventHandler* handler);
500 void Shutdown(); 518 void Shutdown();
501 519
502 static void EventHandlerEntry(uword args); 520 static void EventHandlerEntry(uword args);
503 521
504 int64_t GetTimeout(); 522 int64_t GetTimeout();
505 void HandleInterrupt(InterruptMessage* msg); 523 void HandleInterrupt(InterruptMessage* msg);
506 void HandleTimeout(); 524 void HandleTimeout();
507 void HandleAccept(ListenSocket* listen_socket, OverlappedBuffer* buffer); 525 void HandleAccept(ListenSocket* listen_socket, OverlappedBuffer* buffer);
508 void TryDispatchingPendingAccepts(ListenSocket *listen_socket);
509 void HandleRead(Handle* handle, int bytes, OverlappedBuffer* buffer); 526 void HandleRead(Handle* handle, int bytes, OverlappedBuffer* buffer);
510 void HandleRecvFrom(Handle* handle, int bytes, OverlappedBuffer* buffer); 527 void HandleRecvFrom(Handle* handle, int bytes, OverlappedBuffer* buffer);
511 void HandleWrite(Handle* handle, int bytes, OverlappedBuffer* buffer); 528 void HandleWrite(Handle* handle, int bytes, OverlappedBuffer* buffer);
512 void HandleDisconnect(ClientSocket* client_socket, 529 void HandleDisconnect(ClientSocket* client_socket,
513 int bytes, 530 int bytes,
514 OverlappedBuffer* buffer); 531 OverlappedBuffer* buffer);
515 void HandleConnect(ClientSocket* client_socket, 532 void HandleConnect(ClientSocket* client_socket,
516 int bytes, 533 int bytes,
517 OverlappedBuffer* buffer); 534 OverlappedBuffer* buffer);
518 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); 535 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped);
519 536
520 HANDLE completion_port() { return completion_port_; } 537 HANDLE completion_port() { return completion_port_; }
521 538
522 private: 539 private:
523 ClientSocket* client_sockets_head_; 540 ClientSocket* client_sockets_head_;
524 541
525 TimeoutQueue timeout_queue_; // Time for next timeout. 542 TimeoutQueue timeout_queue_; // Time for next timeout.
526 bool shutdown_; 543 bool shutdown_;
527 HANDLE completion_port_; 544 HANDLE completion_port_;
528 }; 545 };
529 546
530 } // namespace bin 547 } // namespace bin
531 } // namespace dart 548 } // namespace dart
532 549
533 #endif // BIN_EVENTHANDLER_WIN_H_ 550 #endif // BIN_EVENTHANDLER_WIN_H_
OLDNEW
« no previous file with comments | « dart/runtime/bin/eventhandler_macos.cc ('k') | dart/runtime/bin/eventhandler_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698