Skip to content

Commit 5e3e765

Browse files
committed
---
yaml --- r: 6402 b: refs/heads/master c: 1e58049 h: refs/heads/master v: v3
1 parent 6731613 commit 5e3e765

File tree

9 files changed

+26
-25
lines changed

9 files changed

+26
-25
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 792068d871f2a8f7184a6f109db1d65c73bf63da
2+
refs/heads/master: 1e58049da27614034f8eac5bc0e6ef9e2f2be3e6

trunk/src/lib/comm.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ fn recv_<send T>(p: *rustrt::rust_port) -> T {
163163
let killedp = ptr::addr_of(killed);
164164
let res = rusti::call_with_retptr(bind recv(_, p, yieldp, killedp));
165165
if killed != 0u {
166-
fail_killed();
166+
fail "killed";
167167
}
168168
if yield != 0u {
169169
// Data isn't available yet, so res has not been initialized.
@@ -172,10 +172,6 @@ fn recv_<send T>(p: *rustrt::rust_port) -> T {
172172
ret res;
173173
}
174174

175-
fn fail_killed() -> ! {
176-
fail "killed";
177-
}
178-
179175
/*
180176
Function: chan
181177

trunk/src/lib/task.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export spawn_joinable;
5353
#[abi = "rust-intrinsic"]
5454
native mod rusti {
5555
// these must run on the Rust stack so that they can swap stacks etc:
56-
fn task_sleep(task: *rust_task, time_in_us: uint);
56+
fn task_sleep(task: *rust_task, time_in_us: uint, &killed: bool);
5757
}
5858

5959
#[link_name = "rustrt"]
@@ -145,7 +145,11 @@ time_in_us - maximum number of microseconds to yield control for
145145
*/
146146
fn sleep(time_in_us: uint) {
147147
let task = rustrt::rust_get_task();
148-
ret rusti::task_sleep(task, time_in_us);
148+
let killed = false;
149+
rusti::task_sleep(task, time_in_us, killed);
150+
if killed {
151+
fail "killed";
152+
}
149153
}
150154

151155
/*

trunk/src/rt/intrinsics/intrinsics.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ extern "C" CDECL void
1212
port_recv(uintptr_t *dptr, rust_port *port);
1313

1414
extern "C" CDECL void
15-
rust_task_sleep(rust_task *task, size_t time_in_us);
15+
rust_task_sleep(rust_task *task, size_t time_in_us, bool *killed);
1616

1717
extern "C" void
1818
rust_intrinsic_vec_len(size_t *retptr,
@@ -82,7 +82,8 @@ extern "C" void
8282
rust_intrinsic_task_sleep(void **retptr,
8383
void *env,
8484
rust_task *task,
85-
size_t time_in_us) {
86-
rust_task_sleep(task, time_in_us);
85+
size_t time_in_us,
86+
bool *killed) {
87+
rust_task_sleep(task, time_in_us, killed);
8788
}
8889

trunk/src/rt/intrinsics/intrinsics.i386.ll.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ define void @rust_intrinsic_get_type_desc(i8** nocapture %retptr, i8* nocapture
107107
ret void
108108
}
109109

110-
define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i32 %time_in_us) {
111-
tail call void @rust_task_sleep(%struct.rust_task* %task, i32 %time_in_us)
110+
define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i32 %time_in_us, i8* %killed) {
111+
tail call void @rust_task_sleep(%struct.rust_task* %task, i32 %time_in_us, i8* %killed)
112112
ret void
113113
}
114114

115-
declare void @rust_task_sleep(%struct.rust_task*, i32)
115+
declare void @rust_task_sleep(%struct.rust_task*, i32, i8*)
116116

117117
!0 = metadata !{metadata !"any pointer", metadata !1}
118118
!1 = metadata !{metadata !"omnipotent char", metadata !2}

trunk/src/rt/intrinsics/intrinsics.x86_64.ll.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ define void @rust_intrinsic_get_type_desc(i8** nocapture %retptr, i8* nocapture
107107
ret void
108108
}
109109

110-
define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i64 %time_in_us) uwtable {
111-
tail call void @rust_task_sleep(%struct.rust_task* %task, i64 %time_in_us)
110+
define void @rust_intrinsic_task_sleep(i8** nocapture %retptr, i8* nocapture %env, %struct.rust_task* %task, i64 %time_in_us, i8* %killed) uwtable {
111+
tail call void @rust_task_sleep(%struct.rust_task* %task, i64 %time_in_us, i8* %killed)
112112
ret void
113113
}
114114

115-
declare void @rust_task_sleep(%struct.rust_task*, i64)
115+
declare void @rust_task_sleep(%struct.rust_task*, i64, i8*)
116116

117117
!0 = metadata !{metadata !"any pointer", metadata !1}
118118
!1 = metadata !{metadata !"omnipotent char", metadata !2}

trunk/src/rt/rust_builtin.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,8 +511,8 @@ chan_id_send(type_desc *t, rust_task_id target_task_id,
511511
// This is called by an intrinsic on the Rust stack.
512512
// Do not call on the C stack.
513513
extern "C" CDECL void
514-
rust_task_sleep(rust_task *task, size_t time_in_us) {
515-
task->yield(time_in_us);
514+
rust_task_sleep(rust_task *task, size_t time_in_us, bool *killed) {
515+
task->yield(time_in_us, killed);
516516
}
517517

518518
extern "C" CDECL void

trunk/src/rt/rust_task.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,22 +267,22 @@ rust_task::grow(size_t n_frame_bytes)
267267

268268
// Only run this on the rust stack
269269
void
270-
rust_task::yield(size_t time_in_us) {
270+
rust_task::yield(size_t time_in_us, bool *killed) {
271271
LOG(this, task, "task %s @0x%" PRIxPTR " yielding for %d us",
272272
name, this, time_in_us);
273273

274-
if (killed) {
274+
if (this->killed) {
275275
A(sched, !blocked(), "Shouldn't be blocked before failing");
276-
fail();
276+
*killed = true;
277277
}
278278

279279
yield_timer.reset_us(time_in_us);
280280

281281
// Return to the scheduler.
282282
ctx.next->swap(ctx);
283283

284-
if (killed) {
285-
fail();
284+
if (this->killed) {
285+
*killed = true;
286286
}
287287
}
288288

trunk/src/rt/rust_task.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ rust_task : public kernel_owned<rust_task>, rust_cond
158158
void backtrace();
159159

160160
// Yields for a specified duration of time.
161-
void yield(size_t time_in_ms);
161+
void yield(size_t time_in_ms, bool *killed);
162162

163163
// Fail this task (assuming caller-on-stack is different task).
164164
void kill();

0 commit comments

Comments
 (0)