summary refs log tree commit diff
path: root/src/rt
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
parentad80823a6ce301e5133e1ba9aff1560f0a9c2886 (diff)
downloadrust-7685e5de941ec0a482218095e4d6cdd2e53375d8.tar.gz
rust-7685e5de941ec0a482218095e4d6cdd2e53375d8.zip
rt: Refactor the rust_kernel interface a bit
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust.cpp7
-rw-r--r--src/rt/rust_kernel.cpp44
-rw-r--r--src/rt/rust_kernel.h9
-rw-r--r--src/rt/rust_scheduler.cpp2
4 files changed, 36 insertions, 26 deletions
diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp
index dacbcee1045..121f3d4bcfc 100644
--- a/src/rt/rust.cpp
+++ b/src/rt/rust.cpp
@@ -78,8 +78,9 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
     check_claims = env->check_claims;
 
     rust_srv *srv = new rust_srv(env);
-    rust_kernel *kernel = new rust_kernel(srv, env->num_sched_threads);
-    rust_scheduler *sched = kernel->get_default_scheduler();
+    rust_kernel *kernel = new rust_kernel(srv);
+    rust_sched_id sched_id = kernel->create_scheduler(env->num_sched_threads);
+    rust_scheduler *sched = kernel->get_scheduler_by_id(sched_id);
     rust_task_id root_id = sched->create_task(NULL, "main", MAIN_STACK_SIZE);
     rust_task *root_task = kernel->get_task_by_id(root_id);
     I(kernel, root_task != NULL);
@@ -98,7 +99,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
     root_task->deref();
     root_task = NULL;
 
-    int ret = kernel->start_schedulers();
+    int ret = kernel->wait_for_schedulers();
     delete args;
     delete kernel;
     delete srv;
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
diff --git a/src/rt/rust_kernel.h b/src/rt/rust_kernel.h
index fdf9f5eb0f7..34797120ac5 100644
--- a/src/rt/rust_kernel.h
+++ b/src/rt/rust_kernel.h
@@ -46,7 +46,7 @@ public:
 
     struct rust_env *env;
 
-    rust_kernel(rust_srv *srv, size_t num_threads);
+    rust_kernel(rust_srv *srv);
 
     void log(uint32_t level, char const *fmt, ...);
     void fatal(char const *fmt, ...);
@@ -57,10 +57,11 @@ public:
 
     void fail();
 
-    int start_schedulers();
-    rust_scheduler* get_default_scheduler();
+    rust_sched_id create_scheduler(size_t num_threads);
+    rust_scheduler* get_scheduler_by_id(rust_sched_id id);
     // Called by a scheduler to indicate that it is terminating
-    void release_scheduler();
+    void release_scheduler_id(rust_sched_id id);
+    int wait_for_schedulers();
 
 #ifdef __WIN32__
     void win32_require(LPCTSTR fn, BOOL ok);
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index a520d58c6aa..e2389906d86 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -115,6 +115,6 @@ rust_scheduler::release_task_thread() {
 	new_live_threads = --live_threads;
     }
     if (new_live_threads == 0) {
-	kernel->release_scheduler();
+	kernel->release_scheduler_id(id);
     }
 }