diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-04-01 16:38:42 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-04-01 16:57:14 -0700 |
| commit | fb528dd7d613964e05dd682a6a98980a1ebdb4d6 (patch) | |
| tree | 4db5b394786b692e75c7bc08fb880b7d3f235431 /src/rt/rust_scheduler.cpp | |
| parent | 0a5e9d45e172e6aeecefe02e668e454a870bca56 (diff) | |
| download | rust-fb528dd7d613964e05dd682a6a98980a1ebdb4d6.tar.gz rust-fb528dd7d613964e05dd682a6a98980a1ebdb4d6.zip | |
rt: Allow some schedulers to stay alive even without tasks to execute
Diffstat (limited to 'src/rt/rust_scheduler.cpp')
| -rw-r--r-- | src/rt/rust_scheduler.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp index 40d62c76849..57b166208f9 100644 --- a/src/rt/rust_scheduler.cpp +++ b/src/rt/rust_scheduler.cpp @@ -5,14 +5,16 @@ rust_scheduler::rust_scheduler(rust_kernel *kernel, rust_srv *srv, size_t num_threads, - rust_sched_id id) : + rust_sched_id id, + bool allow_exit) : kernel(kernel), srv(srv), env(srv->env), live_threads(num_threads), live_tasks(0), - num_threads(num_threads), cur_thread(0), + may_exit(allow_exit), + num_threads(num_threads), id(id) { create_task_threads(); @@ -103,12 +105,11 @@ rust_scheduler::release_task() { { scoped_lock with(lock); live_tasks--; - if (live_tasks == 0) { + if (live_tasks == 0 && may_exit) { need_exit = true; } } if (need_exit) { - // There are no more tasks on this scheduler. Time to leave exit(); } } @@ -139,3 +140,16 @@ rust_scheduler::release_task_thread() { kernel->release_scheduler_id(id); } } + +void +rust_scheduler::allow_exit() { + bool need_exit = false; + { + scoped_lock with(lock); + may_exit = true; + need_exit = live_tasks == 0; + } + if (need_exit) { + exit(); + } +} |
