about summary refs log tree commit diff
path: root/src/libstd/task/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstd/task/mod.rs')
-rw-r--r--src/libstd/task/mod.rs57
1 files changed, 26 insertions, 31 deletions
diff --git a/src/libstd/task/mod.rs b/src/libstd/task/mod.rs
index a46e115a503..51b1ab603ed 100644
--- a/src/libstd/task/mod.rs
+++ b/src/libstd/task/mod.rs
@@ -258,24 +258,22 @@ impl TaskBuilder {
         self.opts.indestructible = true;
     }
 
-    /**
-     * Get a future representing the exit status of the task.
-     *
-     * Taking the value of the future will block until the child task
-     * terminates. The future-receiving callback specified will be called
-     * *before* the task is spawned; as such, do not invoke .get() within the
-     * closure; rather, store it in an outer variable/list for later use.
-     *
-     * Note that the future returning by this function is only useful for
-     * obtaining the value of the next task to be spawning with the
-     * builder. If additional tasks are spawned with the same builder
-     * then a new result future must be obtained prior to spawning each
-     * task.
-     *
-     * # Failure
-     * Fails if a future_result was already set for this task.
-     */
-    pub fn future_result(&mut self, blk: &fn(v: Port<TaskResult>)) {
+    /// Get a future representing the exit status of the task.
+    ///
+    /// Taking the value of the future will block until the child task
+    /// terminates. The future result return value will be created *before* the task is
+    /// spawned; as such, do not invoke .get() on it directly;
+    /// rather, store it in an outer variable/list for later use.
+    ///
+    /// Note that the future returned by this function is only useful for
+    /// obtaining the value of the next task to be spawning with the
+    /// builder. If additional tasks are spawned with the same builder
+    /// then a new result future must be obtained prior to spawning each
+    /// task.
+    ///
+    /// # Failure
+    /// Fails if a future_result was already set for this task.
+    pub fn future_result(&mut self) -> Port<TaskResult> {
         // 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
@@ -288,10 +286,10 @@ impl TaskBuilder {
         // Construct the future and give it to the caller.
         let (notify_pipe_po, notify_pipe_ch) = stream::<TaskResult>();
 
-        blk(notify_pipe_po);
-
         // Reconfigure self to use a notify channel.
         self.opts.notify_chan = Some(notify_pipe_ch);
+
+        notify_pipe_po
     }
 
     /// Name the task-to-be. Currently the name is used for identification
@@ -398,15 +396,14 @@ impl TaskBuilder {
      */
     pub fn try<T:Send>(&mut self, f: ~fn() -> T) -> Result<T,()> {
         let (po, ch) = stream::<T>();
-        let mut result = None;
 
-        self.future_result(|r| { result = Some(r); });
+        let result = self.future_result();
 
         do self.spawn {
             ch.send(f());
         }
 
-        match result.unwrap().recv() {
+        match result.recv() {
             Success => result::Ok(po.recv()),
             Failure => result::Err(())
         }
@@ -1024,27 +1021,25 @@ fn test_add_wrapper() {
 
 #[test]
 fn test_future_result() {
-    let mut result = None;
     let mut builder = task();
-    builder.future_result(|r| result = Some(r));
+    let result = builder.future_result();
     do builder.spawn {}
-    assert_eq!(result.unwrap().recv(), Success);
+    assert_eq!(result.recv(), Success);
 
-    result = None;
     let mut builder = task();
-    builder.future_result(|r| result = Some(r));
+    let result = builder.future_result();
     builder.unlinked();
     do builder.spawn {
         fail2!();
     }
-    assert_eq!(result.unwrap().recv(), Failure);
+    assert_eq!(result.recv(), Failure);
 }
 
 #[test] #[should_fail]
 fn test_back_to_the_future_result() {
     let mut builder = task();
-    builder.future_result(util::ignore);
-    builder.future_result(util::ignore);
+    builder.future_result();
+    builder.future_result();
 }
 
 #[test]