Skip to content

Commit 6fc730b

Browse files
committed
Cleanup failure handling around rust_new_task_in_sched - closes #2668
1 parent d91e310 commit 6fc730b

File tree

5 files changed

+9
-3
lines changed

5 files changed

+9
-3
lines changed

src/libcore/task.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ fn spawn_raw(opts: task_opts, +f: fn~()) {
538538
new_task_in_new_sched(sched_opts)
539539
}
540540
};
541+
assert !new_task.is_null();
541542

542543
option::iter(opts.notify_chan) {|c|
543544
// FIXME (#1087): Would like to do notification in Rust

src/rt/rust.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ rust_start(uintptr_t main_fn, int argc, char **argv, void* crate_map) {
9595
// Create the main scheduler and the main task
9696
rust_sched_id sched_id = kernel->create_scheduler(env->num_sched_threads);
9797
rust_scheduler *sched = kernel->get_scheduler_by_id(sched_id);
98+
assert(sched != NULL);
9899
rust_task *root_task = sched->create_task(NULL, "main");
99100

100101
// Build the command line arguments to pass to the root task

src/rt/rust_builtin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,8 @@ extern "C" CDECL rust_task*
630630
rust_new_task_in_sched(rust_sched_id id) {
631631
rust_task *task = rust_get_current_task();
632632
rust_scheduler *sched = task->kernel->get_scheduler_by_id(id);
633-
// FIXME (#2668): What if we didn't get the scheduler?
633+
if (sched == NULL)
634+
return NULL;
634635
return new_task_common(sched, task);
635636
}
636637

src/rt/rust_kernel.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ rust_kernel::get_scheduler_by_id(rust_sched_id id) {
121121

122122
rust_scheduler *
123123
rust_kernel::get_scheduler_by_id_nolock(rust_sched_id id) {
124-
assert(id != 0 && "invalid scheduler id");
124+
if (id == 0) {
125+
return NULL;
126+
}
125127
sched_lock.must_have_lock();
126128
sched_map::iterator iter = sched_table.find(id);
127129
if (iter != sched_table.end()) {

src/test/run-pass/rt-sched-1.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ fn main() unsafe {
2222
let new_sched_id = rustrt::rust_new_sched(num_threads);
2323
#error("new_sched_id %?", new_sched_id);
2424
let new_task_id = rustrt::rust_new_task_in_sched(new_sched_id);
25+
assert !new_task_id.is_null();
2526
let f = fn~() {
2627
let child_sched_id = rustrt::rust_get_sched_id();
2728
#error("child_sched_id %?", child_sched_id);
@@ -33,4 +34,4 @@ fn main() unsafe {
3334
rustrt::start_task(new_task_id, fptr);
3435
unsafe::forget(f);
3536
comm::recv(po);
36-
}
37+
}

0 commit comments

Comments
 (0)