| 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 #include "vm/thread_pool.h" | 5 #include "vm/thread_pool.h" |
| 6 | 6 |
| 7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
| 8 #include "vm/lockers.h" | 8 #include "vm/lockers.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 void ThreadPool::Worker::Loop() { | 267 void ThreadPool::Worker::Loop() { |
| 268 MonitorLocker ml(&monitor_); | 268 MonitorLocker ml(&monitor_); |
| 269 int64_t idle_start; | 269 int64_t idle_start; |
| 270 while (true) { | 270 while (true) { |
| 271 ASSERT(task_ != NULL); | 271 ASSERT(task_ != NULL); |
| 272 Task* task = task_; | 272 Task* task = task_; |
| 273 task_ = NULL; | 273 task_ = NULL; |
| 274 | 274 |
| 275 // Release monitor while handling the task. | 275 // Release monitor while handling the task. |
| 276 monitor_.Exit(); | 276 monitor_.Exit(); |
| 277 Thread::EnsureInit(); | |
| 278 task->Run(); | 277 task->Run(); |
| 279 ASSERT(Isolate::Current() == NULL); | 278 ASSERT(Isolate::Current() == NULL); |
| 280 // Prevent unintended sharing of state between tasks. | |
| 281 Thread::CleanUp(); | |
| 282 delete task; | 279 delete task; |
| 283 monitor_.Enter(); | 280 monitor_.Enter(); |
| 284 | 281 |
| 285 ASSERT(task_ == NULL); | 282 ASSERT(task_ == NULL); |
| 286 if (IsDone()) { | 283 if (IsDone()) { |
| 287 return; | 284 return; |
| 288 } | 285 } |
| 289 ASSERT(pool_ != NULL); | 286 ASSERT(pool_ != NULL); |
| 290 pool_->SetIdle(this); | 287 pool_->SetIdle(this); |
| 291 idle_start = OS::GetCurrentTimeMillis(); | 288 idle_start = OS::GetCurrentTimeMillis(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 311 | 308 |
| 312 void ThreadPool::Worker::Shutdown() { | 309 void ThreadPool::Worker::Shutdown() { |
| 313 MonitorLocker ml(&monitor_); | 310 MonitorLocker ml(&monitor_); |
| 314 pool_ = NULL; // Fail fast if someone tries to access pool_. | 311 pool_ = NULL; // Fail fast if someone tries to access pool_. |
| 315 ml.Notify(); | 312 ml.Notify(); |
| 316 } | 313 } |
| 317 | 314 |
| 318 | 315 |
| 319 // static | 316 // static |
| 320 void ThreadPool::Worker::Main(uword args) { | 317 void ThreadPool::Worker::Main(uword args) { |
| 318 Thread::EnsureInit(); |
| 321 Worker* worker = reinterpret_cast<Worker*>(args); | 319 Worker* worker = reinterpret_cast<Worker*>(args); |
| 322 worker->Loop(); | 320 worker->Loop(); |
| 323 | 321 |
| 324 // It should be okay to access these unlocked here in this assert. | 322 // It should be okay to access these unlocked here in this assert. |
| 325 ASSERT(!worker->owned_ && | 323 ASSERT(!worker->owned_ && |
| 326 worker->all_next_ == NULL && | 324 worker->all_next_ == NULL && |
| 327 worker->idle_next_ == NULL); | 325 worker->idle_next_ == NULL); |
| 328 | 326 |
| 329 // The exit monitor is only used during testing. | 327 // The exit monitor is only used during testing. |
| 330 if (ThreadPool::exit_monitor_) { | 328 if (ThreadPool::exit_monitor_) { |
| 331 MonitorLocker ml(ThreadPool::exit_monitor_); | 329 MonitorLocker ml(ThreadPool::exit_monitor_); |
| 332 (*ThreadPool::exit_count_)++; | 330 (*ThreadPool::exit_count_)++; |
| 333 ml.Notify(); | 331 ml.Notify(); |
| 334 } | 332 } |
| 335 delete worker; | 333 delete worker; |
| 334 #if defined(TARGET_OS_WINDOWS) |
| 335 Thread::CleanUp(); |
| 336 #endif |
| 336 } | 337 } |
| 337 | 338 |
| 338 } // namespace dart | 339 } // namespace dart |
| OLD | NEW |