diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 92637ace632e..dd0ae7846bcb 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -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(); diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index 300c1df133ca..cc4a2a0ffe3e 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -68,7 +68,6 @@ rust_task : public kernel_owned, 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_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 diff --git a/src/rt/rust_task_thread.cpp b/src/rt/rust_task_thread.cpp index 20166e261b98..cb05a9864767 100644 --- a/src/rt/rust_task_thread.cpp +++ b/src/rt/rust_task_thread.cpp @@ -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();