From 6fc730baf6b3d156e7be7521cd60f352f2c0ea93 Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 28 Jun 2012 19:01:55 -0400 Subject: [PATCH] Cleanup failure handling around rust_new_task_in_sched - closes #2668 --- src/libcore/task.rs | 1 + src/rt/rust.cpp | 1 + src/rt/rust_builtin.cpp | 3 ++- src/rt/rust_kernel.cpp | 4 +++- src/test/run-pass/rt-sched-1.rs | 3 ++- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libcore/task.rs b/src/libcore/task.rs index 51f4a7c23cba..9f379bbd94a2 100644 --- a/src/libcore/task.rs +++ b/src/libcore/task.rs @@ -538,6 +538,7 @@ fn spawn_raw(opts: task_opts, +f: fn~()) { new_task_in_new_sched(sched_opts) } }; + assert !new_task.is_null(); option::iter(opts.notify_chan) {|c| // FIXME (#1087): Would like to do notification in Rust diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp index 67b3bf84938b..150156ddae95 100644 --- a/src/rt/rust.cpp +++ b/src/rt/rust.cpp @@ -95,6 +95,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) { // Create the main scheduler and the main task rust_sched_id sched_id = kernel->create_scheduler(env->num_sched_threads); rust_scheduler *sched = kernel->get_scheduler_by_id(sched_id); + assert(sched != NULL); rust_task *root_task = sched->create_task(NULL, "main"); // Build the command line arguments to pass to the root task diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 04d11e020ea8..a33d3cb90fed 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -630,7 +630,8 @@ extern "C" CDECL rust_task* rust_new_task_in_sched(rust_sched_id id) { rust_task *task = rust_get_current_task(); rust_scheduler *sched = task->kernel->get_scheduler_by_id(id); - // FIXME (#2668): What if we didn't get the scheduler? + if (sched == NULL) + return NULL; return new_task_common(sched, task); } diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index b13b1490c0f8..82fec98e86ae 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -121,7 +121,9 @@ rust_kernel::get_scheduler_by_id(rust_sched_id id) { rust_scheduler * rust_kernel::get_scheduler_by_id_nolock(rust_sched_id id) { - assert(id != 0 && "invalid scheduler id"); + if (id == 0) { + return NULL; + } sched_lock.must_have_lock(); sched_map::iterator iter = sched_table.find(id); if (iter != sched_table.end()) { diff --git a/src/test/run-pass/rt-sched-1.rs b/src/test/run-pass/rt-sched-1.rs index 447380663f45..a8ce61370a6f 100644 --- a/src/test/run-pass/rt-sched-1.rs +++ b/src/test/run-pass/rt-sched-1.rs @@ -22,6 +22,7 @@ fn main() unsafe { let new_sched_id = rustrt::rust_new_sched(num_threads); #error("new_sched_id %?", new_sched_id); let new_task_id = rustrt::rust_new_task_in_sched(new_sched_id); + assert !new_task_id.is_null(); let f = fn~() { let child_sched_id = rustrt::rust_get_sched_id(); #error("child_sched_id %?", child_sched_id); @@ -33,4 +34,4 @@ fn main() unsafe { rustrt::start_task(new_task_id, fptr); unsafe::forget(f); comm::recv(po); -} \ No newline at end of file +}