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

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

Issue 1291163002: Join embeder threads on Windows. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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
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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_running_;
280 bool read_thread_finished_;
281 Monitor* read_thread_monitor_;
282
278 private: 283 private:
284 void WaitForReadThreadStarted();
285 void NotifyReadThreadStarted();
286 void WaitForReadThreadFinished();
287 void NotifyReadThreadFinished();
288
279 int flags_; 289 int flags_;
280 CRITICAL_SECTION cs_; // Critical section protecting this object. 290 CRITICAL_SECTION cs_; // Critical section protecting this object.
281 }; 291 };
282 292
283 293
284 class FileHandle : public DescriptorInfoSingleMixin<Handle> { 294 class FileHandle : public DescriptorInfoSingleMixin<Handle> {
285 public: 295 public:
286 explicit FileHandle(HANDLE handle) 296 explicit FileHandle(HANDLE handle)
287 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle), true) { 297 : DescriptorInfoSingleMixin(reinterpret_cast<intptr_t>(handle), true) {
288 type_ = kFile; 298 type_ = kFile;
289 } 299 }
290 300
291 virtual void EnsureInitialized(EventHandlerImplementation* event_handler); 301 virtual void EnsureInitialized(EventHandlerImplementation* event_handler);
292 virtual bool IsClosed(); 302 virtual bool IsClosed();
293 }; 303 };
294 304
295 305
296 class StdHandle : public FileHandle { 306 class StdHandle : public FileHandle {
297 public: 307 public:
298 explicit StdHandle(HANDLE handle) 308 explicit StdHandle(HANDLE handle)
299 : FileHandle(handle), 309 : FileHandle(handle),
310 thread_id_(Thread::kInvalidThreadId),
300 thread_wrote_(0), 311 thread_wrote_(0),
301 write_thread_exists_(false), 312 write_thread_exists_(false),
302 write_thread_running_(false), 313 write_thread_running_(false),
303 write_monitor_(new Monitor()) { 314 write_monitor_(new Monitor()) {
304 type_ = kStd; 315 type_ = kStd;
305 } 316 }
306 317
307 ~StdHandle() { 318 ~StdHandle() {
308 delete write_monitor_; 319 delete write_monitor_;
309 } 320 }
310 321
311 virtual void DoClose(); 322 virtual void DoClose();
312 virtual intptr_t Write(const void* buffer, intptr_t num_bytes); 323 virtual intptr_t Write(const void* buffer, intptr_t num_bytes);
313 324
314 void WriteSyncCompleteAsync(); 325 void WriteSyncCompleteAsync();
315 void RunWriteLoop(); 326 void RunWriteLoop();
316 327
317 private: 328 private:
329 ThreadId thread_id_;
318 intptr_t thread_wrote_; 330 intptr_t thread_wrote_;
319 bool write_thread_exists_; 331 bool write_thread_exists_;
320 bool write_thread_running_; 332 bool write_thread_running_;
321 Monitor* write_monitor_; 333 Monitor* write_monitor_;
322 }; 334 };
323 335
324 336
325 class DirectoryWatchHandle : public DescriptorInfoSingleMixin<Handle> { 337 class DirectoryWatchHandle : public DescriptorInfoSingleMixin<Handle> {
326 public: 338 public:
327 DirectoryWatchHandle(HANDLE handle, int events, bool recursive) 339 DirectoryWatchHandle(HANDLE handle, int events, bool recursive)
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 void HandleConnect(ClientSocket* client_socket, 531 void HandleConnect(ClientSocket* client_socket,
520 int bytes, 532 int bytes,
521 OverlappedBuffer* buffer); 533 OverlappedBuffer* buffer);
522 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped); 534 void HandleIOCompletion(DWORD bytes, ULONG_PTR key, OVERLAPPED* overlapped);
523 535
524 HANDLE completion_port() { return completion_port_; } 536 HANDLE completion_port() { return completion_port_; }
525 537
526 private: 538 private:
527 ClientSocket* client_sockets_head_; 539 ClientSocket* client_sockets_head_;
528 540
541 Monitor* startup_monitor_;
542 ThreadId handler_thread_id_;
543
529 TimeoutQueue timeout_queue_; // Time for next timeout. 544 TimeoutQueue timeout_queue_; // Time for next timeout.
530 bool shutdown_; 545 bool shutdown_;
531 HANDLE completion_port_; 546 HANDLE completion_port_;
532 }; 547 };
533 548
534 } // namespace bin 549 } // namespace bin
535 } // namespace dart 550 } // namespace dart
536 551
537 #endif // BIN_EVENTHANDLER_WIN_H_ 552 #endif // BIN_EVENTHANDLER_WIN_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698