rustrt: Reorganize task usage
Most of the comments are available on the Task structure itself, but this commit is aimed at making FFI-style usage of Rust tasks a little nicer. Primarily, this commit enables re-use of tasks across multiple invocations. The method `run` will no longer unconditionally destroy the task itself. Rather, the task will be internally re-usable if the closure specified did not fail. Once a task has failed once it is considered poisoned and it can never be used again. Along the way I tried to document shortcomings of the current method of tearing down a task, opening a few issues as well. For now none of the behavior is a showstopper, but it's useful to acknowledge it. Also along the way I attempted to remove as much `unsafe` code as possible, opting for safer abstractions.
This commit is contained in:
parent
bab614f5fa
commit
7d756e44a9
9 changed files with 338 additions and 119 deletions
|
|
@ -295,8 +295,8 @@ impl<S: Spawner> TaskBuilder<S> {
|
|||
let (tx_done, rx_done) = channel(); // signal that task has exited
|
||||
let (tx_retv, rx_retv) = channel(); // return value from task
|
||||
|
||||
let on_exit = proc(res) { tx_done.send(res) };
|
||||
self.spawn_internal(proc() { tx_retv.send(f()) },
|
||||
let on_exit = proc(res) { let _ = tx_done.send_opt(res); };
|
||||
self.spawn_internal(proc() { let _ = tx_retv.send_opt(f()); },
|
||||
Some(on_exit));
|
||||
|
||||
Future::from_fn(proc() {
|
||||
|
|
@ -641,3 +641,14 @@ mod test {
|
|||
// NOTE: the corresponding test for stderr is in run-pass/task-stderr, due
|
||||
// to the test harness apparently interfering with stderr configuration.
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn task_abort_no_kill_runtime() {
|
||||
use std::io::timer;
|
||||
use mem;
|
||||
|
||||
let mut tb = TaskBuilder::new();
|
||||
let rx = tb.try_future(proc() {});
|
||||
mem::drop(rx);
|
||||
timer::sleep(1000);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue