diff options
Diffstat (limited to 'src/rt/rust_kernel.cpp')
| -rw-r--r-- | src/rt/rust_kernel.cpp | 102 |
1 files changed, 16 insertions, 86 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index f1ce434cd34..c04a8d9d427 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -1,5 +1,6 @@ #include "rust_internal.h" #include "rust_util.h" +#include "rust_scheduler.h" #define KLOG_(...) \ KLOG(this, kern, __VA_ARGS__) @@ -12,64 +13,11 @@ rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) : srv(srv), max_id(0), rval(0), - num_threads(num_threads), live_tasks(0), env(srv->env) { - isaac_init(this, &rctx); - create_schedulers(); -} - -rust_task_thread * -rust_kernel::create_scheduler(int id) { - _kernel_lock.lock(); - rust_srv *srv = this->srv->clone(); - rust_task_thread *thread = - new (this, "rust_task_thread") rust_task_thread(this, srv, id); - KLOG_("created scheduler: " PTR ", id: %d, index: %d", - thread, id, thread->list_index); - _kernel_lock.unlock(); - return thread; -} - -void -rust_kernel::destroy_scheduler(rust_task_thread *thread) { - _kernel_lock.lock(); - KLOG_("deleting scheduler: " PTR ", name: %s, index: %d", - thread, thread->name, thread->list_index); - rust_srv *srv = thread->srv; - delete thread; - delete srv; - _kernel_lock.unlock(); -} - -void rust_kernel::create_schedulers() { - KLOG_("Using %d scheduler threads.", num_threads); - - for(size_t i = 0; i < num_threads; ++i) { - threads.push(create_scheduler(i)); - } -} - -void rust_kernel::destroy_schedulers() { - for(size_t i = 0; i < num_threads; ++i) { - destroy_scheduler(threads[i]); - } -} - -void -rust_kernel::log_all_scheduler_state() { - for(size_t i = 0; i < num_threads; ++i) { - threads[i]->log_state(); - } -} - -/** - * Checks for simple deadlocks. - */ -bool -rust_kernel::is_deadlocked() { - return false; + sched = new (this, "rust_scheduler") + rust_scheduler(this, srv, num_threads); } void @@ -94,7 +42,7 @@ rust_kernel::fatal(char const *fmt, ...) { } rust_kernel::~rust_kernel() { - destroy_schedulers(); + delete sched; } void * @@ -111,24 +59,9 @@ void rust_kernel::free(void *mem) { _region.free(mem); } -void -rust_kernel::signal_kernel_lock() { - _kernel_lock.lock(); - _kernel_lock.unlock(); -} - -int rust_kernel::start_task_threads() +int rust_kernel::start_schedulers() { - for(size_t i = 0; i < num_threads; ++i) { - rust_task_thread *thread = threads[i]; - thread->start(); - } - - for(size_t i = 0; i < num_threads; ++i) { - rust_task_thread *thread = threads[i]; - thread->join(); - } - + sched->start_task_threads(); return rval; } @@ -141,21 +74,13 @@ rust_kernel::fail() { #if defined(__WIN32__) exit(rval); #endif - for(size_t i = 0; i < num_threads; ++i) { - rust_task_thread *thread = threads[i]; - thread->kill_all_tasks(); - } + sched->kill_all_tasks(); } rust_task_id rust_kernel::create_task(rust_task *spawner, const char *name, size_t init_stack_sz) { - scoped_lock with(_kernel_lock); - rust_task_thread *thread = threads[isaac_rand(&rctx) % num_threads]; - rust_task *t = thread->create_task(spawner, name, init_stack_sz); - t->user.id = max_id++; - task_table.put(t->user.id, t); - return t->user.id; + return sched->create_task(spawner, name, init_stack_sz); } rust_task_id @@ -163,6 +88,13 @@ rust_kernel::create_task(rust_task *spawner, const char *name) { return create_task(spawner, name, env->min_stack_size); } +void +rust_kernel::register_task(rust_task *task) { + scoped_lock with(_kernel_lock); + task->user.id = max_id++; + task_table.put(task->user.id, task); +} + rust_task * rust_kernel::get_task_by_id(rust_task_id id) { scoped_lock with(_kernel_lock); @@ -190,9 +122,7 @@ rust_kernel::release_task_id(rust_task_id id) { } void rust_kernel::exit_schedulers() { - for(size_t i = 0; i < num_threads; ++i) { - threads[i]->exit(); - } + sched->exit(); } #ifdef __WIN32__ |
