diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-02-06 21:06:12 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-02-08 15:42:47 -0800 |
| commit | 7685e5de941ec0a482218095e4d6cdd2e53375d8 (patch) | |
| tree | a12b6b1b82c2a068a2ae3264b17c3a0fb28163cf /src/rt | |
| parent | ad80823a6ce301e5133e1ba9aff1560f0a9c2886 (diff) | |
| download | rust-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.cpp | 7 | ||||
| -rw-r--r-- | src/rt/rust_kernel.cpp | 44 | ||||
| -rw-r--r-- | src/rt/rust_kernel.h | 9 | ||||
| -rw-r--r-- | src/rt/rust_scheduler.cpp | 2 |
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); } } |
