about summary refs log tree commit diff
path: root/src/rt/rust_scheduler.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-04-01 16:38:42 -0700
committerBrian Anderson <banderson@mozilla.com>2012-04-01 16:57:14 -0700
commitfb528dd7d613964e05dd682a6a98980a1ebdb4d6 (patch)
tree4db5b394786b692e75c7bc08fb880b7d3f235431 /src/rt/rust_scheduler.cpp
parent0a5e9d45e172e6aeecefe02e668e454a870bca56 (diff)
downloadrust-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.cpp22
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();
+    }
+}