about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-11-18 15:36:48 -0800
committerBrian Anderson <banderson@mozilla.com>2011-11-18 15:36:48 -0800
commit1e58049da27614034f8eac5bc0e6ef9e2f2be3e6 (patch)
treec563329196ecb410c7834a068dea1f8421378007
parent792068d871f2a8f7184a6f109db1d65c73bf63da (diff)
downloadrust-1e58049da27614034f8eac5bc0e6ef9e2f2be3e6.tar.gz
rust-1e58049da27614034f8eac5bc0e6ef9e2f2be3e6.zip
rt: Remove fail calls from rust_task::yield
-rw-r--r--src/lib/comm.rs6
-rw-r--r--src/lib/task.rs8
-rw-r--r--src/rt/intrinsics/intrinsics.cpp7
-rw-r--r--src/rt/intrinsics/intrinsics.i386.ll.in6
-rw-r--r--src/rt/intrinsics/intrinsics.x86_64.ll.in6
-rw-r--r--src/rt/rust_builtin.cpp4
-rw-r--r--src/rt/rust_task.cpp10
-rw-r--r--src/rt/rust_task.h2
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();