diff options
Diffstat (limited to 'src/libstd/task.rs')
| -rw-r--r-- | src/libstd/task.rs | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/libstd/task.rs b/src/libstd/task.rs index 3b573b87574..55ebba69d90 100644 --- a/src/libstd/task.rs +++ b/src/libstd/task.rs @@ -38,12 +38,13 @@ use any::Any; use comm::{Sender, Receiver, channel}; -use io::Writer; +use io::{Writer, stdio}; use kinds::{Send, marker}; use option::{None, Some, Option}; use owned::Box; use result::{Result, Ok, Err}; use rt::local::Local; +use rt::task; use rt::task::Task; use str::{Str, SendStr, IntoMaybeOwned}; @@ -53,18 +54,10 @@ use str::{Str, SendStr, IntoMaybeOwned}; #[cfg(test)] use str::StrAllocating; #[cfg(test)] use string::String; -/// Indicates the manner in which a task exited. -/// -/// A task that completes without failing is considered to exit successfully. -/// -/// If you wish for this result's delivery to block until all -/// children tasks complete, recommend using a result future. -pub type TaskResult = Result<(), Box<Any:Send>>; - /// Task configuration options pub struct TaskOpts { /// Enable lifecycle notifications on the given channel - pub notify_chan: Option<Sender<TaskResult>>, + pub notify_chan: Option<Sender<task::Result>>, /// A name for the task-to-be, for identification in failure messages pub name: Option<SendStr>, /// The size of the stack for the spawned task @@ -114,7 +107,7 @@ impl TaskBuilder { /// /// # Failure /// Fails if a future_result was already set for this task. - pub fn future_result(&mut self) -> Receiver<TaskResult> { + pub fn future_result(&mut self) -> Receiver<task::Result> { // FIXME (#3725): Once linked failure and notification are // handled in the library, I can imagine implementing this by just // registering an arbitrary number of task::on_exit handlers and @@ -180,7 +173,28 @@ impl TaskBuilder { Some(t) => t, None => fail!("need a local task to spawn a new task"), }; - t.spawn_sibling(self.opts, f); + let TaskOpts { notify_chan, name, stack_size, stdout, stderr } = self.opts; + + let opts = task::TaskOpts { + on_exit: notify_chan.map(|c| proc(r) c.send(r)), + name: name, + stack_size: stack_size, + }; + if stdout.is_some() || stderr.is_some() { + t.spawn_sibling(opts, proc() { + match stdout { + Some(handle) => { let _ = stdio::set_stdout(handle); } + None => {} + } + match stderr { + Some(handle) => { let _ = stdio::set_stderr(handle); } + None => {} + } + f(); + }); + } else { + t.spawn_sibling(opts, f); + } } /** |
