@@ -18,6 +18,7 @@ use vec::OwnedVector;
18
18
use result:: { Result , Ok , Err } ;
19
19
use unstable:: run_in_bare_thread;
20
20
use super :: io:: net:: ip:: { IpAddr , Ipv4 } ;
21
+ use rt:: comm:: oneshot;
21
22
use rt:: task:: Task ;
22
23
use rt:: thread:: Thread ;
23
24
use rt:: local:: Local ;
@@ -47,8 +48,11 @@ pub fn run_in_newsched_task(f: ~fn()) {
47
48
48
49
do run_in_bare_thread {
49
50
let mut sched = ~new_test_uv_sched( ) ;
51
+ let mut new_task = ~Task :: new_root ( ) ;
52
+ let on_exit: ~fn ( bool ) = |exit_status| rtassert ! ( exit_status) ;
53
+ new_task. on_exit = Some ( on_exit) ;
50
54
let task = ~Coroutine :: with_task ( & mut sched. stack_pool ,
51
- ~ Task :: new_root ( ) ,
55
+ new_task ,
52
56
f. take ( ) ) ;
53
57
sched. enqueue_task ( task) ;
54
58
sched. run ( ) ;
@@ -94,16 +98,20 @@ pub fn run_in_mt_newsched_task(f: ~fn()) {
94
98
95
99
let f_cell = Cell ( f_cell. take ( ) ) ;
96
100
let handles = Cell ( handles) ;
97
- let main_task = ~do Coroutine :: new_root ( & mut scheds [ 0 ] . stack_pool ) {
98
- f_cell . take ( ) ( ) ;
101
+ let mut new_task = ~Task :: new_root ( ) ;
102
+ let on_exit : ~ fn ( bool ) = |exit_status| {
99
103
100
104
let mut handles = handles. take ( ) ;
101
105
// Tell schedulers to exit
102
106
for handles. each_mut |handle| {
103
107
handle. send ( Shutdown ) ;
104
108
}
105
- } ;
106
109
110
+ rtassert ! ( exit_status) ;
111
+ } ;
112
+ new_task. on_exit = Some ( on_exit) ;
113
+ let main_task = ~Coroutine :: with_task ( & mut scheds[ 0 ] . stack_pool ,
114
+ new_task, f_cell. take ( ) ) ;
107
115
scheds[ 0 ] . enqueue_task ( main_task) ;
108
116
109
117
let mut threads = ~[ ] ;
@@ -213,36 +221,21 @@ pub fn spawntask_random(f: ~fn()) {
213
221
pub fn spawntask_try( f : ~fn ( ) ) -> Result < ( ) , ( ) > {
214
222
use cell:: Cell ;
215
223
use super :: sched:: * ;
216
- use task;
217
- use unstable:: finally:: Finally ;
218
-
219
- // Our status variables will be filled in from the scheduler context
220
- let mut failed = false ;
221
- let failed_ptr: * mut bool = & mut failed;
222
-
223
- // Switch to the scheduler
224
- let f = Cell ( Cell ( f) ) ;
225
- let sched = Local :: take :: < Scheduler > ( ) ;
226
- do sched. deschedule_running_task_and_then ( ) |sched, old_task| {
227
- let old_task = Cell ( old_task) ;
228
- let f = f. take ( ) ;
229
- let new_task = ~do Coroutine :: new_root ( & mut sched. stack_pool ) {
230
- do ( || {
231
- ( f. take ( ) ) ( )
232
- } ) . finally {
233
- // Check for failure then resume the parent task
234
- unsafe { * failed_ptr = task:: failing ( ) ; }
235
- let sched = Local :: take :: < Scheduler > ( ) ;
236
- do sched. switch_running_tasks_and_then ( old_task. take ( ) ) |sched, new_task| {
237
- sched. enqueue_task ( new_task) ;
238
- }
239
- }
240
- } ;
241
224
242
- sched. enqueue_task ( new_task) ;
225
+ let ( port, chan) = oneshot ( ) ;
226
+ let chan = Cell ( chan) ;
227
+ let mut new_task = ~Task :: new_root ( ) ;
228
+ let on_exit: ~fn ( bool ) = |exit_status| chan. take ( ) . send ( exit_status) ;
229
+ new_task. on_exit = Some ( on_exit) ;
230
+ let mut sched = Local :: take :: < Scheduler > ( ) ;
231
+ let new_task = ~Coroutine :: with_task ( & mut sched. stack_pool ,
232
+ new_task, f) ;
233
+ do sched. switch_running_tasks_and_then ( new_task) |sched, old_task| {
234
+ sched. enqueue_task ( old_task) ;
243
235
}
244
236
245
- if !failed { Ok ( ( ) ) } else { Err ( ( ) ) }
237
+ let exit_status = port. recv ( ) ;
238
+ if exit_status { Ok ( ( ) ) } else { Err ( ( ) ) }
246
239
}
247
240
248
241
// Spawn a new task in a new scheduler and return a thread handle.
0 commit comments