about summary refs log tree commit diff
path: root/src/rt/rust_kernel.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-06 21:06:12 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-08 15:42:47 -0800
commit7685e5de941ec0a482218095e4d6cdd2e53375d8 (patch)
treea12b6b1b82c2a068a2ae3264b17c3a0fb28163cf /src/rt/rust_kernel.cpp
parentad80823a6ce301e5133e1ba9aff1560f0a9c2886 (diff)
downloadrust-7685e5de941ec0a482218095e4d6cdd2e53375d8.tar.gz
rust-7685e5de941ec0a482218095e4d6cdd2e53375d8.zip
rt: Refactor the rust_kernel interface a bit
Diffstat (limited to 'src/rt/rust_kernel.cpp')
-rw-r--r--src/rt/rust_kernel.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp
index 3d74571c373..3b9a60a3064 100644
--- a/src/rt/rust_kernel.cpp
+++ b/src/rt/rust_kernel.cpp
@@ -7,18 +7,16 @@
 #define KLOG_ERR_(field, ...)                   \
     KLOG_LVL(this, field, log_err, __VA_ARGS__)
 
-rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) :
+rust_kernel::rust_kernel(rust_srv *srv) :
     _region(srv, true),
     _log(srv, NULL),
     srv(srv),
     live_tasks(0),
     max_task_id(0),
     rval(0),
+    live_schedulers(0),
     env(srv->env)
 {
-    sched = new (this, "rust_scheduler")
-        rust_scheduler(this, srv, num_threads, 0);
-    live_schedulers = 1;
 }
 
 void
@@ -56,27 +54,22 @@ void rust_kernel::free(void *mem) {
     _region.free(mem);
 }
 
-int rust_kernel::start_schedulers()
-{
-    I(this, !sched_lock.lock_held_by_current_thread());
-    sched->start_task_threads();
-    {
-        scoped_lock with(sched_lock);
-        // Schedulers could possibly have already exited
-        if (live_schedulers != 0) {
-            sched_lock.wait();
-        }
-        return rval;
-    }
+rust_sched_id
+rust_kernel::create_scheduler(size_t num_threads) {
+    I(this, live_schedulers == 0);
+    sched = new (this, "rust_scheduler")
+        rust_scheduler(this, srv, num_threads, 0);
+    live_schedulers = 1;
+    return 0;
 }
 
 rust_scheduler *
-rust_kernel::get_default_scheduler() {
+rust_kernel::get_scheduler_by_id(rust_sched_id id) {
     return sched;
 }
 
 void
-rust_kernel::release_scheduler() {
+rust_kernel::release_scheduler_id(rust_sched_id id) {
     I(this, !sched_lock.lock_held_by_current_thread());
     scoped_lock with(sched_lock);
     delete sched;
@@ -87,6 +80,21 @@ rust_kernel::release_scheduler() {
     }
 }
 
+int
+rust_kernel::wait_for_schedulers()
+{
+    I(this, !sched_lock.lock_held_by_current_thread());
+    sched->start_task_threads();
+    {
+        scoped_lock with(sched_lock);
+        // Schedulers could possibly have already exited
+        if (live_schedulers != 0) {
+            sched_lock.wait();
+        }
+        return rval;
+    }
+}
+
 void
 rust_kernel::fail() {
     // FIXME: On windows we're getting "Application has requested the