| OLD | NEW |
| 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 #include "vm/thread_interrupter.h" | 5 #include "vm/thread_interrupter.h" |
| 6 | 6 |
| 7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
| 8 #include "vm/lockers.h" | 8 #include "vm/lockers.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/simulator.h" | 10 #include "vm/simulator.h" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 | 91 |
| 92 void ThreadInterrupter::Shutdown() { | 92 void ThreadInterrupter::Shutdown() { |
| 93 { | 93 { |
| 94 MonitorLocker shutdown_ml(monitor_); | 94 MonitorLocker shutdown_ml(monitor_); |
| 95 if (shutdown_) { | 95 if (shutdown_) { |
| 96 // Already shutdown. | 96 // Already shutdown. |
| 97 return; | 97 return; |
| 98 } | 98 } |
| 99 shutdown_ = true; | 99 shutdown_ = true; |
| 100 // Notify. | 100 // Notify. |
| 101 monitor_->Notify(); | 101 shutdown_ml.Notify(); |
| 102 ASSERT(initialized_); | 102 ASSERT(initialized_); |
| 103 if (FLAG_trace_thread_interrupter) { | 103 if (FLAG_trace_thread_interrupter) { |
| 104 OS::Print("ThreadInterrupter shutting down.\n"); | 104 OS::Print("ThreadInterrupter shutting down.\n"); |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 // Join the thread. | 108 // Join the thread. |
| 109 ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadJoinId); | 109 ASSERT(interrupter_thread_id_ != OSThread::kInvalidThreadJoinId); |
| 110 OSThread::Join(interrupter_thread_id_); | 110 OSThread::Join(interrupter_thread_id_); |
| 111 interrupter_thread_id_ = OSThread::kInvalidThreadJoinId; | 111 interrupter_thread_id_ = OSThread::kInvalidThreadJoinId; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 // Woken up from deep sleep. | 176 // Woken up from deep sleep. |
| 177 ASSERT(interrupted_thread_count == 0); | 177 ASSERT(interrupted_thread_count == 0); |
| 178 // Return to regular interrupts. | 178 // Return to regular interrupts. |
| 179 current_wait_time_ = interrupt_period_; | 179 current_wait_time_ = interrupt_period_; |
| 180 } | 180 } |
| 181 | 181 |
| 182 // Reset count before interrupting any threads. | 182 // Reset count before interrupting any threads. |
| 183 interrupted_thread_count = 0; | 183 interrupted_thread_count = 0; |
| 184 | 184 |
| 185 // Temporarily drop the monitor while we interrupt threads. | 185 // Temporarily drop the monitor while we interrupt threads. |
| 186 monitor_->Exit(); | 186 wait_ml.Exit(); |
| 187 | 187 |
| 188 { | 188 { |
| 189 OSThreadIterator it; | 189 OSThreadIterator it; |
| 190 while (it.HasNext()) { | 190 while (it.HasNext()) { |
| 191 OSThread* thread = it.Next(); | 191 OSThread* thread = it.Next(); |
| 192 if (thread->ThreadInterruptsEnabled()) { | 192 if (thread->ThreadInterruptsEnabled()) { |
| 193 interrupted_thread_count++; | 193 interrupted_thread_count++; |
| 194 InterruptThread(thread); | 194 InterruptThread(thread); |
| 195 } | 195 } |
| 196 } | 196 } |
| 197 } | 197 } |
| 198 | 198 |
| 199 // Take the monitor lock again. | 199 // Take the monitor lock again. |
| 200 monitor_->Enter(); | 200 wait_ml.Enter(); |
| 201 | 201 |
| 202 // Now that we have the lock, check if we were signaled to wake up while | 202 // Now that we have the lock, check if we were signaled to wake up while |
| 203 // interrupting threads. | 203 // interrupting threads. |
| 204 if (!woken_up_ && (interrupted_thread_count == 0)) { | 204 if (!woken_up_ && (interrupted_thread_count == 0)) { |
| 205 // No threads were interrupted and we were not signaled to interrupt | 205 // No threads were interrupted and we were not signaled to interrupt |
| 206 // new threads. In order to reduce unnecessary CPU load, we will wait | 206 // new threads. In order to reduce unnecessary CPU load, we will wait |
| 207 // until we are notified before attempting to interrupt again. | 207 // until we are notified before attempting to interrupt again. |
| 208 current_wait_time_ = Monitor::kNoTimeout; | 208 current_wait_time_ = Monitor::kNoTimeout; |
| 209 continue; | 209 continue; |
| 210 } | 210 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 222 // Signal to main thread we are exiting. | 222 // Signal to main thread we are exiting. |
| 223 MonitorLocker shutdown_ml(monitor_); | 223 MonitorLocker shutdown_ml(monitor_); |
| 224 thread_running_ = false; | 224 thread_running_ = false; |
| 225 shutdown_ml.Notify(); | 225 shutdown_ml.Notify(); |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 #endif // !PRODUCT | 229 #endif // !PRODUCT |
| 230 | 230 |
| 231 } // namespace dart | 231 } // namespace dart |
| OLD | NEW |