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

Unified Diff: runtime/vm/thread_interrupter.cc

Issue 1275353005: VM thread shutdown. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Merge Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/thread_interrupter.h ('k') | runtime/vm/thread_pool.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/thread_interrupter.cc
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index 0cf7c3814b1badcc1a8c839c3ecdaef9730b872b..58c94bec797cc04dadc697d31c33db8dd7d31f8e 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -51,8 +51,8 @@ DEFINE_FLAG(bool, trace_thread_interrupter, false,
bool ThreadInterrupter::initialized_ = false;
bool ThreadInterrupter::shutdown_ = false;
bool ThreadInterrupter::thread_running_ = false;
-ThreadId ThreadInterrupter::interrupter_thread_id_ =
- OSThread::kInvalidThreadId;
+ThreadJoinId ThreadInterrupter::interrupter_thread_id_ =
+ OSThread::kInvalidThreadJoinId;
Monitor* ThreadInterrupter::monitor_ = NULL;
intptr_t ThreadInterrupter::interrupt_period_ = 1000;
intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout;
@@ -71,7 +71,7 @@ void ThreadInterrupter::Startup() {
if (FLAG_trace_thread_interrupter) {
OS::Print("ThreadInterrupter starting up.\n");
}
- ASSERT(interrupter_thread_id_ == OSThread::kInvalidThreadId);
+ ASSERT(interrupter_thread_id_ == OSThread::kInvalidThreadJoinId);
{
MonitorLocker startup_ml(monitor_);
OSThread::Start(ThreadMain, 0);
@@ -79,7 +79,7 @@ void ThreadInterrupter::Startup() {
startup_ml.Wait();
}
}
- ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadId);
+ ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadJoinId);
if (FLAG_trace_thread_interrupter) {
OS::Print("ThreadInterrupter running.\n");
}
@@ -101,24 +101,12 @@ void ThreadInterrupter::Shutdown() {
OS::Print("ThreadInterrupter shutting down.\n");
}
}
-#if defined(TARGET_OS_WINDOWS)
- // On Windows, a thread's exit-code can leak into the process's exit-code,
- // if exiting 'at same time' as the process ends. By joining with the thread
- // here, we avoid this race condition.
- ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadId);
+
+ // Join the thread.
+ ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadJoinId);
OSThread::Join(interrupter_thread_id_);
- interrupter_thread_id_ = OSThread::kInvalidThreadId;
-#else
- // On non-Windows platforms, just wait for the thread interrupter to signal
- // that it has exited the loop.
- {
- MonitorLocker shutdown_ml(monitor_);
- while (thread_running_) {
- // Wait for thread to exit.
- shutdown_ml.Wait();
- }
- }
-#endif
+ interrupter_thread_id_ = OSThread::kInvalidThreadJoinId;
+
if (FLAG_trace_thread_interrupter) {
OS::Print("ThreadInterrupter shut down.\n");
}
@@ -187,7 +175,7 @@ void ThreadInterrupter::ThreadMain(uword parameters) {
{
// Signal to main thread we are ready.
MonitorLocker startup_ml(monitor_);
- interrupter_thread_id_ = OSThread::GetCurrentThreadId();
+ interrupter_thread_id_ = OSThread::GetCurrentThreadJoinId();
thread_running_ = true;
startup_ml.Notify();
}
@@ -198,6 +186,10 @@ void ThreadInterrupter::ThreadMain(uword parameters) {
while (!shutdown_) {
intptr_t r = wait_ml.WaitMicros(current_wait_time_);
+ if ((r == Monitor::kNotified) && shutdown_) {
+ break;
+ }
+
if ((r == Monitor::kNotified) && InDeepSleep()) {
// Woken up from deep sleep.
ASSERT(visitor.profiled_thread_count() == 0);
« no previous file with comments | « runtime/vm/thread_interrupter.h ('k') | runtime/vm/thread_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698