OLD | NEW |
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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 HANDLE handle_; | 268 HANDLE handle_; |
269 HANDLE completion_port_; | 269 HANDLE completion_port_; |
270 EventHandlerImplementation* event_handler_; | 270 EventHandlerImplementation* event_handler_; |
271 | 271 |
272 OverlappedBuffer* data_ready_; // Buffer for data ready to be read. | 272 OverlappedBuffer* data_ready_; // Buffer for data ready to be read. |
273 OverlappedBuffer* pending_read_; // Buffer for pending read. | 273 OverlappedBuffer* pending_read_; // Buffer for pending read. |
274 OverlappedBuffer* pending_write_; // Buffer for pending write | 274 OverlappedBuffer* pending_write_; // Buffer for pending write |
275 | 275 |
276 DWORD last_error_; | 276 DWORD last_error_; |
277 | 277 |
| 278 ThreadId read_thread_id_; |
| 279 bool read_thread_exists_; |
| 280 Monitor* read_thread_monitor_; |
| 281 |
278 private: | 282 private: |
279 int flags_; | 283 int flags_; |
280 CRITICAL_SECTION cs_; // Critical section protecting this object. | 284 CRITICAL_SECTION cs_; // Critical section protecting this object. |
281 }; | 285 }; |
282 | 286 |
283 | 287 |
284 class FileHandle : public DescriptorInfoSingleMixin<Handle> { | 288 class FileHandle : public DescriptorInfoSingleMixin<Handle> { |
285 public: | 289 public: |
286 explicit FileHandle(HANDLE handle) | 290 explicit FileHandle(HANDLE handle) |
287 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle), true) { | 291 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle), true) { |
288 type_ = kFile; | 292 type_ = kFile; |
289 } | 293 } |
290 | 294 |
291 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); | 295 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); |
292 virtual bool IsClosed(); | 296 virtual bool IsClosed(); |
293 }; | 297 }; |
294 | 298 |
295 | 299 |
296 class StdHandle : public FileHandle { | 300 class StdHandle : public FileHandle { |
297 public: | 301 public: |
298 explicit StdHandle(HANDLE handle) | 302 explicit StdHandle(HANDLE handle) |
299 : FileHandle(handle), | 303 : FileHandle(handle), |
| 304 thread_id_(Thread::kInvalidThreadId), |
300 thread_wrote_(0), | 305 thread_wrote_(0), |
301 write_thread_exists_(false), | 306 write_thread_exists_(false), |
302 write_thread_running_(false), | 307 write_thread_running_(false), |
303 write_monitor_(new Monitor()) { | 308 write_monitor_(new Monitor()) { |
304 type_ = kStd; | 309 type_ = kStd; |
305 } | 310 } |
306 | 311 |
307 ~StdHandle() { | 312 ~StdHandle() { |
308 delete write_monitor_; | 313 delete write_monitor_; |
309 } | 314 } |
310 | 315 |
311 virtual void DoClose(); | 316 virtual void DoClose(); |
312 virtual intptr_t Write(const void* buffer, intptr_t num_bytes); | 317 virtual intptr_t Write(const void* buffer, intptr_t num_bytes); |
313 | 318 |
314 void WriteSyncCompleteAsync(); | 319 void WriteSyncCompleteAsync(); |
315 void RunWriteLoop(); | 320 void RunWriteLoop(); |
316 | 321 |
317 private: | 322 private: |
| 323 ThreadId thread_id_; |
318 intptr_t thread_wrote_; | 324 intptr_t thread_wrote_; |
319 bool write_thread_exists_; | 325 bool write_thread_exists_; |
320 bool write_thread_running_; | 326 bool write_thread_running_; |
321 Monitor* write_monitor_; | 327 Monitor* write_monitor_; |
322 }; | 328 }; |
323 | 329 |
324 | 330 |
325 class DirectoryWatchHandle : public DescriptorInfoSingleMixin<Handle> { | 331 class DirectoryWatchHandle : public DescriptorInfoSingleMixin<Handle> { |
326 public: | 332 public: |
327 DirectoryWatchHandle(HANDLE handle, int events, bool recursive) | 333 DirectoryWatchHandle(HANDLE handle, int events, bool recursive) |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 void HandleConnect(ClientSocket* client_socket, | 525 void HandleConnect(ClientSocket* client_socket, |
520 int bytes, | 526 int bytes, |
521 OverlappedBuffer* buffer); | 527 OverlappedBuffer* buffer); |
522 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); | 528 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); |
523 | 529 |
524 HANDLE completion_port() { return completion_port_; } | 530 HANDLE completion_port() { return completion_port_; } |
525 | 531 |
526 private: | 532 private: |
527 ClientSocket* client_sockets_head_; | 533 ClientSocket* client_sockets_head_; |
528 | 534 |
| 535 Monitor* startup_monitor_; |
| 536 ThreadId handler_thread_id_; |
| 537 |
529 TimeoutQueue timeout_queue_; // Time for next timeout. | 538 TimeoutQueue timeout_queue_; // Time for next timeout. |
530 bool shutdown_; | 539 bool shutdown_; |
531 HANDLE completion_port_; | 540 HANDLE completion_port_; |
532 }; | 541 }; |
533 | 542 |
534 } // namespace bin | 543 } // namespace bin |
535 } // namespace dart | 544 } // namespace dart |
536 | 545 |
537 #endif // BIN_EVENTHANDLER_WIN_H_ | 546 #endif // BIN_EVENTHANDLER_WIN_H_ |
OLD | NEW |