diff options
| author | Ben Blum <bblum@andrew.cmu.edu> | 2012-07-20 18:06:17 -0400 |
|---|---|---|
| committer | Ben Blum <bblum@andrew.cmu.edu> | 2012-07-20 19:23:19 -0400 |
| commit | 5bb4a12900969b3250c490a5e0682c658fe65ba8 (patch) | |
| tree | 9fee7318849691fd35658af7363dfdd8d433b0c9 /src/rt/rust_sched_loop.cpp | |
| parent | f55999fd7a03b4f876e69e94e491d3c30bf0c076 (diff) | |
| download | rust-5bb4a12900969b3250c490a5e0682c658fe65ba8.tar.gz rust-5bb4a12900969b3250c490a5e0682c658fe65ba8.zip | |
[1/4 for #2365, #2671] Fix create/kill race with schedulers and tasks during rust_kernel::fail
Diffstat (limited to 'src/rt/rust_sched_loop.cpp')
| -rw-r--r-- | src/rt/rust_sched_loop.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/rt/rust_sched_loop.cpp b/src/rt/rust_sched_loop.cpp index 1fbc0c1e07c..aa2c62c630d 100644 --- a/src/rt/rust_sched_loop.cpp +++ b/src/rt/rust_sched_loop.cpp @@ -13,12 +13,13 @@ const size_t C_STACK_SIZE = 1024*1024; bool rust_sched_loop::tls_initialized = false; -rust_sched_loop::rust_sched_loop(rust_scheduler *sched,int id) : +rust_sched_loop::rust_sched_loop(rust_scheduler *sched, int id, bool killed) : _log(this), id(id), should_exit(false), cached_c_stack(NULL), dead_task(NULL), + killed(killed), pump_signal(NULL), kernel(sched->kernel), sched(sched), @@ -63,6 +64,8 @@ rust_sched_loop::kill_all_tasks() { { scoped_lock with(lock); + // Any task created after this will be killed. See transition, below. + killed = true; for (size_t i = 0; i < running_tasks.length(); i++) { all_tasks.push_back(running_tasks[i]); @@ -319,6 +322,11 @@ rust_sched_loop::transition(rust_task *task, } task->set_state(dst, cond, cond_name); + // If the entire runtime is failing, newborn tasks must be doomed. + if (src == task_state_newborn && killed) { + task->kill_inner(); + } + pump_loop(); } |
