rt: Protect rust_task::state with a lock

This commit is contained in:
Brian Anderson 2012-03-02 21:22:42 -08:00
parent d7298a797b
commit b2a075e20d
3 changed files with 15 additions and 5 deletions

View File

@ -74,7 +74,6 @@ rust_task::rust_task(rust_task_thread *thread, rust_task_list *state,
cache(NULL),
kernel(thread->kernel),
name(name),
state(state),
cond(NULL),
cond_name("none"),
list_index(-1),
@ -87,6 +86,7 @@ rust_task::rust_task(rust_task_thread *thread, rust_task_list *state,
dynastack(this),
cc_counter(0),
total_stack_sz(0),
state(state),
killed(false),
reentered_rust_stack(false),
c_stack(NULL),
@ -355,12 +355,14 @@ rust_task::get_frame_glue_fns(uintptr_t fp) {
bool
rust_task::running()
{
scoped_lock with(state_lock);
return state == &thread->running_tasks;
}
bool
rust_task::blocked()
{
scoped_lock with(state_lock);
return state == &thread->blocked_tasks;
}
@ -373,6 +375,7 @@ rust_task::blocked_on(rust_cond *on)
bool
rust_task::dead()
{
scoped_lock with(state_lock);
return state == &thread->dead_tasks;
}
@ -407,7 +410,10 @@ rust_task::transition(rust_task_list *src, rust_task_list *dst) {
I(thread, state == src);
src->remove(this);
dst->append(this);
state = dst;
{
scoped_lock with(state_lock);
state = dst;
}
thread->lock.signal();
if(unlock)
thread->lock.unlock();

View File

@ -68,7 +68,6 @@ rust_task : public kernel_owned<rust_task>, rust_cond
// Fields known only to the runtime.
rust_kernel *kernel;
const char *const name;
rust_task_list *state;
rust_cond *cond;
const char *cond_name;
int32_t list_index;
@ -107,6 +106,9 @@ rust_task : public kernel_owned<rust_task>, rust_cond
private:
lock_and_signal state_lock;
rust_task_list *state;
// Protects the killed flag
lock_and_signal kill_lock;
// Indicates that the task was killed and needs to unwind
@ -218,6 +220,8 @@ public:
bool have_c_stack() { return c_stack != NULL; }
rust_port_selector *get_port_selector() { return &port_selector; }
rust_task_list *get_state() { return state; }
};
// This stuff is on the stack-switching fast path

View File

@ -259,7 +259,7 @@ rust_task_thread::start_main_loop() {
", state: %s",
scheduled_task->name,
(uintptr_t)scheduled_task,
scheduled_task->state->name);
scheduled_task->get_state()->name);
place_task_in_tls(scheduled_task);
@ -273,7 +273,7 @@ rust_task_thread::start_main_loop() {
" in state '%s', worker id=%d" PRIxPTR,
scheduled_task->name,
(uintptr_t)scheduled_task,
scheduled_task->state->name,
scheduled_task->get_state()->name,
id);
reap_dead_tasks();