From 2465a63a69ea51d4fce10430b6a8fd0079cbbcd5 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 3 Mar 2012 02:36:53 -0800 Subject: [PATCH] rt: Move transition from rust_task to rust_task_thread --- src/rt/rust_task.cpp | 30 ++++++++++-------------------- src/rt/rust_task.h | 7 +++++-- src/rt/rust_task_thread.cpp | 23 +++++++++++++++++++++++ src/rt/rust_task_thread.h | 4 ++++ 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 3c375f0b4c3..0e9e7b2eb85 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -401,26 +401,16 @@ rust_task::free(void *p) void rust_task::transition(rust_task_list *src, rust_task_list *dst, rust_cond *cond, const char* cond_name) { - bool unlock = false; - if(!thread->lock.lock_held_by_current_thread()) { - unlock = true; - thread->lock.lock(); - } - DLOG(thread, task, - "task %s " PTR " state change '%s' -> '%s' while in '%s'", - name, (uintptr_t)this, src->name, dst->name, state->name); - I(thread, state == src); - src->remove(this); - dst->append(this); - { - scoped_lock with(state_lock); - state = dst; - this->cond = cond; - this->cond_name = cond_name; - } - thread->lock.signal(); - if(unlock) - thread->lock.unlock(); + thread->transition(this, src, dst, cond, cond_name); +} + +void +rust_task::set_state(rust_task_list *state, + rust_cond *cond, const char* cond_name) { + scoped_lock with(state_lock); + this->state = state; + this->cond = cond; + this->cond_name = cond_name; } void diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index a940b6299ac..4f1ae792ae2 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -137,6 +137,9 @@ private: void return_c_stack(); + void transition(rust_task_list *src, rust_task_list *dst, + rust_cond *cond, const char* cond_name); + friend void task_start_wrapper(spawn_args *a); friend void cleanup_task(cleanup_args *a); friend void reset_stack_limit_on_c_stack(reset_args *a); @@ -163,8 +166,8 @@ public: void *realloc(void *data, size_t sz); void free(void *p); - void transition(rust_task_list *src, rust_task_list *dst, - rust_cond *cond, const char* cond_name); + void set_state(rust_task_list *state, + rust_cond *cond, const char* cond_name); void block(rust_cond *on, const char* name); void wakeup(rust_cond *from); diff --git a/src/rt/rust_task_thread.cpp b/src/rt/rust_task_thread.cpp index 472b58f1671..57164a97c0f 100644 --- a/src/rt/rust_task_thread.cpp +++ b/src/rt/rust_task_thread.cpp @@ -319,6 +319,29 @@ rust_task_thread::create_task(rust_task *spawner, const char *name, return task->id; } +void +rust_task_thread::transition(rust_task *task, + rust_task_list *src, rust_task_list *dst, + rust_cond *cond, const char* cond_name) { + bool unlock = false; + if(!lock.lock_held_by_current_thread()) { + unlock = true; + lock.lock(); + } + DLOG(this, task, + "task %s " PTR " state change '%s' -> '%s' while in '%s'", + name, (uintptr_t)this, src->name, dst->name, + task->get_state()->name); + I(this, task->get_state() == src); + src->remove(task); + dst->append(task); + task->set_state(dst, cond, cond_name); + + lock.signal(); + if(unlock) + lock.unlock(); +} + void rust_task_thread::run() { this->start_main_loop(); sched->release_task_thread(); diff --git a/src/rt/rust_task_thread.h b/src/rt/rust_task_thread.h index 49da2eeeaf5..7b05c185be1 100644 --- a/src/rt/rust_task_thread.h +++ b/src/rt/rust_task_thread.h @@ -123,6 +123,10 @@ public: rust_task_id create_task(rust_task *spawner, const char *name, size_t init_stack_sz); + void transition(rust_task *task, + rust_task_list *src, rust_task_list *dst, + rust_cond *cond, const char* cond_name); + virtual void run(); void init_tls();