diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-11-18 15:36:48 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-18 15:36:48 -0800 |
| commit | 1e58049da27614034f8eac5bc0e6ef9e2f2be3e6 (patch) | |
| tree | c563329196ecb410c7834a068dea1f8421378007 | |
| parent | 792068d871f2a8f7184a6f109db1d65c73bf63da (diff) | |
| download | rust-1e58049da27614034f8eac5bc0e6ef9e2f2be3e6.tar.gz rust-1e58049da27614034f8eac5bc0e6ef9e2f2be3e6.zip | |
rt: Remove fail calls from rust_task::yield
| -rw-r--r-- | src/lib/comm.rs | 6 | ||||
| -rw-r--r-- | src/lib/task.rs | 8 | ||||
| -rw-r--r-- | src/rt/intrinsics/intrinsics.cpp | 7 | ||||
| -rw-r--r-- | src/rt/intrinsics/intrinsics.i386.ll.in | 6 | ||||
| -rw-r--r-- | src/rt/intrinsics/intrinsics.x86_64.ll.in | 6 | ||||
| -rw-r--r-- | src/rt/rust_builtin.cpp | 4 | ||||
| -rw-r--r-- | src/rt/rust_task.cpp | 10 | ||||
| -rw-r--r-- | src/rt/rust_task.h | 2 |
8 files changed, 25 insertions, 24 deletions
diff --git a/src/lib/comm.rs b/src/lib/comm.rs index 9acee18c8cc..e00205a522b 100644 --- a/src/lib/comm.rs +++ b/src/lib/comm.rs @@ -163,7 +163,7 @@ fn recv_<send T>(p: *rustrt::rust_port) -> T { let killedp = ptr::addr_of(killed); let res = rusti::call_with_retptr(bind recv(_, p, yieldp, killedp)); if killed != 0u { - fail_killed(); + fail "killed"; } if yield != 0u { // Data isn't available yet, so res has not been initialized. @@ -172,10 +172,6 @@ fn recv_<send T>(p: *rustrt::rust_port) -> T { ret res; } -fn fail_killed() -> ! { - fail "killed"; -} - /* Function: chan diff --git a/src/lib/task.rs b/src/lib/task.rs index 1d7f859bfa2..e90bc87c471 100644 --- a/src/lib/task.rs +++ b/src/lib/task.rs @@ -53,7 +53,7 @@ export spawn_joinable; #[abi = "rust-intrinsic"] native mod rusti { // these must run on the Rust stack so that they can swap stacks etc: - fn task_sleep(task: *rust_task, time_in_us: uint); + fn task_sleep(task: *rust_task, time_in_us: uint, &killed: bool); } #[link_name = "rustrt"] @@ -145,7 +145,11 @@ time_in_us - maximum number of microseconds to yield control for */ fn sleep(time_in_us: uint) { let task = rustrt::rust_get_task(); - ret rusti::task_sleep(task, time_in_us); + let killed = false; + rusti::task_sleep(task, time_in_us, killed); + if killed { + fail "killed"; + } } /* diff --git a/src/rt/intrinsics/intrinsics.cpp b/src/rt/intrinsics/intrinsics.cpp index 23f4cf50672..aab71fb80af 100644 --- a/src/rt/intrinsics/intrinsics.cpp +++ b/src/rt/intrinsics/intrinsics.cpp @@ -12,7 +12,7 @@ extern "C" CDECL void port_recv(uintptr_t *dptr, rust_port *port); extern "C" CDECL void -rust_task_sleep(rust_task *task, size_t time_in_us); +rust_task_sleep(rust_task *task, size_t time_in_us, bool *killed); extern "C" void rust_intrinsic_vec_len(size_t *retptr, @@ -82,7 +82,8 @@ extern "C" void rust_intrinsic_task_sleep(void **retptr, void *env, rust_task *task, - size_t time_in_us) { - rust_task_sleep(task, time_in_us); + size_t time_in_us, + bool *killed) { + rust_task_sleep(task, time_in_us, killed); } diff --git a/src/rt/intrinsics/intrinsics.i386.ll.in b/src/rt/intrinsics/intrinsics.i386.ll.in index 10267ba1700..0edf3d3ddf0 100644 --- a/src/rt/intrinsics/intrinsics.i386.ll.in +++ b/src/rt/intrinsics/intrinsics.i386.ll.in @@ -107,12 +107,12 @@ define void @rust_intrinsic_get_type_desc(i8** nocapture %retptr, i8* nocapture ret void } -define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i32 %time_in_us) { - tail call void @rust_task_sleep(%struct.rust_task* %task, i32 %time_in_us) +define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i32 %time_in_us, i8* %killed) { + tail call void @rust_task_sleep(%struct.rust_task* %task, i32 %time_in_us, i8* %killed) ret void } -declare void @rust_task_sleep(%struct.rust_task*, i32) +declare void @rust_task_sleep(%struct.rust_task*, i32, i8*) !0 = metadata !{metadata !"any pointer", metadata !1} !1 = metadata !{metadata !"omnipotent char", metadata !2} diff --git a/src/rt/intrinsics/intrinsics.x86_64.ll.in b/src/rt/intrinsics/intrinsics.x86_64.ll.in index 849acd5b3e0..a1eaf123980 100644 --- a/src/rt/intrinsics/intrinsics.x86_64.ll.in +++ b/src/rt/intrinsics/intrinsics.x86_64.ll.in @@ -107,12 +107,12 @@ define void @rust_intrinsic_get_type_desc(i8** nocapture %retptr, i8* nocapture ret void } -define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i64 %time_in_us) uwtable { - tail call void @rust_task_sleep(%struct.rust_task* %task, i64 %time_in_us) +define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i64 %time_in_us, i8* %killed) uwtable { + tail call void @rust_task_sleep(%struct.rust_task* %task, i64 %time_in_us, i8* %killed) ret void } -declare void @rust_task_sleep(%struct.rust_task*, i64) +declare void @rust_task_sleep(%struct.rust_task*, i64, i8*) !0 = metadata !{metadata !"any pointer", metadata !1} !1 = metadata !{metadata !"omnipotent char", metadata !2} diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index ff83cb7ec6b..6b57fae7470 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -511,8 +511,8 @@ chan_id_send(type_desc *t, rust_task_id target_task_id, // This is called by an intrinsic on the Rust stack. // Do not call on the C stack. extern "C" CDECL void -rust_task_sleep(rust_task *task, size_t time_in_us) { - task->yield(time_in_us); +rust_task_sleep(rust_task *task, size_t time_in_us, bool *killed) { + task->yield(time_in_us, killed); } extern "C" CDECL void diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 39f8488e784..e996563b0f5 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -267,13 +267,13 @@ rust_task::grow(size_t n_frame_bytes) // Only run this on the rust stack void -rust_task::yield(size_t time_in_us) { +rust_task::yield(size_t time_in_us, bool *killed) { LOG(this, task, "task %s @0x%" PRIxPTR " yielding for %d us", name, this, time_in_us); - if (killed) { + if (this->killed) { A(sched, !blocked(), "Shouldn't be blocked before failing"); - fail(); + *killed = true; } yield_timer.reset_us(time_in_us); @@ -281,8 +281,8 @@ rust_task::yield(size_t time_in_us) { // Return to the scheduler. ctx.next->swap(ctx); - if (killed) { - fail(); + if (this->killed) { + *killed = true; } } diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index 6aa94c6b6d4..a6d68331fda 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -158,7 +158,7 @@ rust_task : public kernel_owned<rust_task>, rust_cond void backtrace(); // Yields for a specified duration of time. - void yield(size_t time_in_ms); + void yield(size_t time_in_ms, bool *killed); // Fail this task (assuming caller-on-stack is different task). void kill(); |
