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

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

Issue 1978153002: Uses an open thread handle as the ThreadJoinId on Windows. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix test Created 4 years, 7 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
« no previous file with comments | « no previous file | runtime/bin/thread.h » ('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) 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 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(TARGET_OS_WINDOWS) 8 #if defined(TARGET_OS_WINDOWS)
9 9
10 #include "bin/eventhandler.h" 10 #include "bin/eventhandler.h"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 181
182 void Handle::WaitForReadThreadStarted() { 182 void Handle::WaitForReadThreadStarted() {
183 MonitorLocker ml(monitor_); 183 MonitorLocker ml(monitor_);
184 while (read_thread_starting_) { 184 while (read_thread_starting_) {
185 ml.Wait(); 185 ml.Wait();
186 } 186 }
187 } 187 }
188 188
189 189
190 void Handle::WaitForReadThreadFinished() { 190 void Handle::WaitForReadThreadFinished() {
191 // Join the Reader thread if there is one. 191 MonitorLocker ml(monitor_);
192 ThreadId to_join = Thread::kInvalidThreadId; 192 if (read_thread_id_ != Thread::kInvalidThreadId) {
193 { 193 while (!read_thread_finished_) {
194 MonitorLocker ml(monitor_); 194 ml.Wait();
195 if (read_thread_id_ != Thread::kInvalidThreadId) {
196 while (!read_thread_finished_) {
197 ml.Wait();
198 }
199 read_thread_finished_ = false;
200 to_join = read_thread_id_;
201 read_thread_id_ = Thread::kInvalidThreadId;
202 } 195 }
203 } 196 read_thread_finished_ = false;
204 if (to_join != Thread::kInvalidThreadId) { 197 read_thread_id_ = Thread::kInvalidThreadId;
205 Thread::Join(to_join);
206 } 198 }
207 } 199 }
208 200
209 201
210 void Handle::ReadComplete(OverlappedBuffer* buffer) { 202 void Handle::ReadComplete(OverlappedBuffer* buffer) {
211 WaitForReadThreadStarted(); 203 WaitForReadThreadStarted();
212 { 204 {
213 MonitorLocker ml(monitor_); 205 MonitorLocker ml(monitor_);
214 // Currently only one outstanding read at the time. 206 // Currently only one outstanding read at the time.
215 ASSERT(pending_read_ == buffer); 207 ASSERT(pending_read_ == buffer);
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 824
833 825
834 void StdHandle::DoClose() { 826 void StdHandle::DoClose() {
835 MonitorLocker ml(monitor_); 827 MonitorLocker ml(monitor_);
836 if (write_thread_exists_) { 828 if (write_thread_exists_) {
837 write_thread_running_ = false; 829 write_thread_running_ = false;
838 ml.Notify(); 830 ml.Notify();
839 while (write_thread_exists_) { 831 while (write_thread_exists_) {
840 ml.Wait(Monitor::kNoTimeout); 832 ml.Wait(Monitor::kNoTimeout);
841 } 833 }
842 Thread::Join(thread_id_);
843 } 834 }
844 Handle::DoClose(); 835 Handle::DoClose();
845 } 836 }
846 837
847 838
848 bool ClientSocket::LoadDisconnectEx() { 839 bool ClientSocket::LoadDisconnectEx() {
849 // Load the DisconnectEx function into memory using WSAIoctl. 840 // Load the DisconnectEx function into memory using WSAIoctl.
850 GUID guid_disconnect_ex = WSAID_DISCONNECTEX; 841 GUID guid_disconnect_ex = WSAID_DISCONNECTEX;
851 DWORD bytes; 842 DWORD bytes;
852 int status = WSAIoctl(socket(), 843 int status = WSAIoctl(socket(),
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 completion_port_ = 1360 completion_port_ =
1370 CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1); 1361 CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1);
1371 if (completion_port_ == NULL) { 1362 if (completion_port_ == NULL) {
1372 FATAL("Completion port creation failed"); 1363 FATAL("Completion port creation failed");
1373 } 1364 }
1374 shutdown_ = false; 1365 shutdown_ = false;
1375 } 1366 }
1376 1367
1377 1368
1378 EventHandlerImplementation::~EventHandlerImplementation() { 1369 EventHandlerImplementation::~EventHandlerImplementation() {
1379 Thread::Join(handler_thread_id_);
1380 delete startup_monitor_; 1370 delete startup_monitor_;
1381 CloseHandle(completion_port_); 1371 CloseHandle(completion_port_);
1382 } 1372 }
1383 1373
1384 1374
1385 int64_t EventHandlerImplementation::GetTimeout() { 1375 int64_t EventHandlerImplementation::GetTimeout() {
1386 if (!timeout_queue_.HasTimeout()) { 1376 if (!timeout_queue_.HasTimeout()) {
1387 return kInfinityTimeout; 1377 return kInfinityTimeout;
1388 } 1378 }
1389 int64_t millis = timeout_queue_.CurrentTimeout() - 1379 int64_t millis = timeout_queue_.CurrentTimeout() -
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1502 void EventHandlerImplementation::Shutdown() { 1492 void EventHandlerImplementation::Shutdown() {
1503 SendData(kShutdownId, 0, 0); 1493 SendData(kShutdownId, 0, 0);
1504 } 1494 }
1505 1495
1506 } // namespace bin 1496 } // namespace bin
1507 } // namespace dart 1497 } // namespace dart
1508 1498
1509 #endif // defined(TARGET_OS_WINDOWS) 1499 #endif // defined(TARGET_OS_WINDOWS)
1510 1500
1511 #endif // !defined(DART_IO_DISABLED) 1501 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « no previous file | runtime/bin/thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698