Skip to content

Commit 3f240fe

Browse files
committed
auto merge of #9926 : Kimundi/rust/future_result_bad_sig, r=huonw
2 parents 71c3f8c + 3011801 commit 3f240fe

15 files changed

+47
-88
lines changed

src/libextra/arc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ mod tests {
823823
do 5.times {
824824
let arc3 = arc.clone();
825825
let mut builder = task::task();
826-
builder.future_result(|r| children.push(r));
826+
children.push(builder.future_result());
827827
do builder.spawn {
828828
do arc3.read |num| {
829829
assert!(*num >= 0);

src/libextra/test.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -870,14 +870,12 @@ pub fn run_test(force_ignore: bool,
870870
testfn: ~fn()) {
871871
let testfn_cell = ::std::cell::Cell::new(testfn);
872872
do task::spawn {
873-
let mut result_future = None; // task::future_result(builder);
874-
875873
let mut task = task::task();
876874
task.unlinked();
877-
task.future_result(|r| { result_future = Some(r) });
875+
let result_future = task.future_result();
878876
task.spawn(testfn_cell.take());
879877

880-
let task_result = result_future.unwrap().recv();
878+
let task_result = result_future.recv();
881879
let test_result = calc_result(&desc,
882880
task_result == task::Success);
883881
monitor_ch.send((desc.clone(), test_result));

src/libstd/result.rs

-1
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,6 @@ mod tests {
463463
use str::OwnedStr;
464464
use vec::ImmutableVector;
465465
use to_str::ToStr;
466-
use fmt::Default;
467466

468467
pub fn op1() -> Result<int, ~str> { Ok(666) }
469468
pub fn op2() -> Result<int, ~str> { Err(~"sadface") }

src/libstd/rt/task.rs

-25
Original file line numberDiff line numberDiff line change
@@ -621,29 +621,4 @@ mod test {
621621
a.next = Some(b);
622622
}
623623
}
624-
625-
// XXX: This is a copy of test_future_result in std::task.
626-
// It can be removed once the scheduler is turned on by default.
627-
#[test]
628-
fn future_result() {
629-
do run_in_newsched_task {
630-
use option::{Some, None};
631-
use task::*;
632-
633-
let mut result = None;
634-
let mut builder = task();
635-
builder.future_result(|r| result = Some(r));
636-
do builder.spawn {}
637-
assert_eq!(result.unwrap().recv(), Success);
638-
639-
result = None;
640-
let mut builder = task();
641-
builder.future_result(|r| result = Some(r));
642-
builder.unlinked();
643-
do builder.spawn {
644-
fail2!();
645-
}
646-
assert_eq!(result.unwrap().recv(), Failure);
647-
}
648-
}
649624
}

src/libstd/task/mod.rs

+26-31
Original file line numberDiff line numberDiff line change
@@ -258,24 +258,22 @@ impl TaskBuilder {
258258
self.opts.indestructible = true;
259259
}
260260

261-
/**
262-
* Get a future representing the exit status of the task.
263-
*
264-
* Taking the value of the future will block until the child task
265-
* terminates. The future-receiving callback specified will be called
266-
* *before* the task is spawned; as such, do not invoke .get() within the
267-
* closure; rather, store it in an outer variable/list for later use.
268-
*
269-
* Note that the future returning by this function is only useful for
270-
* obtaining the value of the next task to be spawning with the
271-
* builder. If additional tasks are spawned with the same builder
272-
* then a new result future must be obtained prior to spawning each
273-
* task.
274-
*
275-
* # Failure
276-
* Fails if a future_result was already set for this task.
277-
*/
278-
pub fn future_result(&mut self, blk: &fn(v: Port<TaskResult>)) {
261+
/// Get a future representing the exit status of the task.
262+
///
263+
/// Taking the value of the future will block until the child task
264+
/// terminates. The future result return value will be created *before* the task is
265+
/// spawned; as such, do not invoke .get() on it directly;
266+
/// rather, store it in an outer variable/list for later use.
267+
///
268+
/// Note that the future returned by this function is only useful for
269+
/// obtaining the value of the next task to be spawning with the
270+
/// builder. If additional tasks are spawned with the same builder
271+
/// then a new result future must be obtained prior to spawning each
272+
/// task.
273+
///
274+
/// # Failure
275+
/// Fails if a future_result was already set for this task.
276+
pub fn future_result(&mut self) -> Port<TaskResult> {
279277
// FIXME (#3725): Once linked failure and notification are
280278
// handled in the library, I can imagine implementing this by just
281279
// registering an arbitrary number of task::on_exit handlers and
@@ -288,10 +286,10 @@ impl TaskBuilder {
288286
// Construct the future and give it to the caller.
289287
let (notify_pipe_po, notify_pipe_ch) = stream::<TaskResult>();
290288

291-
blk(notify_pipe_po);
292-
293289
// Reconfigure self to use a notify channel.
294290
self.opts.notify_chan = Some(notify_pipe_ch);
291+
292+
notify_pipe_po
295293
}
296294

297295
/// Name the task-to-be. Currently the name is used for identification
@@ -398,15 +396,14 @@ impl TaskBuilder {
398396
*/
399397
pub fn try<T:Send>(&mut self, f: ~fn() -> T) -> Result<T,()> {
400398
let (po, ch) = stream::<T>();
401-
let mut result = None;
402399

403-
self.future_result(|r| { result = Some(r); });
400+
let result = self.future_result();
404401

405402
do self.spawn {
406403
ch.send(f());
407404
}
408405

409-
match result.unwrap().recv() {
406+
match result.recv() {
410407
Success => result::Ok(po.recv()),
411408
Failure => result::Err(())
412409
}
@@ -1024,27 +1021,25 @@ fn test_add_wrapper() {
10241021

10251022
#[test]
10261023
fn test_future_result() {
1027-
let mut result = None;
10281024
let mut builder = task();
1029-
builder.future_result(|r| result = Some(r));
1025+
let result = builder.future_result();
10301026
do builder.spawn {}
1031-
assert_eq!(result.unwrap().recv(), Success);
1027+
assert_eq!(result.recv(), Success);
10321028

1033-
result = None;
10341029
let mut builder = task();
1035-
builder.future_result(|r| result = Some(r));
1030+
let result = builder.future_result();
10361031
builder.unlinked();
10371032
do builder.spawn {
10381033
fail2!();
10391034
}
1040-
assert_eq!(result.unwrap().recv(), Failure);
1035+
assert_eq!(result.recv(), Failure);
10411036
}
10421037

10431038
#[test] #[should_fail]
10441039
fn test_back_to_the_future_result() {
10451040
let mut builder = task();
1046-
builder.future_result(util::ignore);
1047-
builder.future_result(util::ignore);
1041+
builder.future_result();
1042+
builder.future_result();
10481043
}
10491044

10501045
#[test]

src/libstd/unstable/sync.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -580,32 +580,29 @@ mod tests {
580580
// Now try the same thing, but with the child task blocking.
581581
let x = Exclusive::new(~~"hello");
582582
let x2 = Cell::new(x.clone());
583-
let mut res = None;
584583
let mut builder = task::task();
585-
builder.future_result(|r| res = Some(r));
584+
let res = builder.future_result();
586585
do builder.spawn {
587586
let x2 = x2.take();
588587
assert!(x2.unwrap() == ~~"hello");
589588
}
590589
// Have to get rid of our reference before blocking.
591590
util::ignore(x);
592-
res.unwrap().recv();
591+
res.recv();
593592
}
594593
595594
#[test] #[should_fail]
596595
fn exclusive_new_unwrap_conflict() {
597596
let x = Exclusive::new(~~"hello");
598597
let x2 = Cell::new(x.clone());
599-
let mut res = None;
600598
let mut builder = task::task();
601-
builder.future_result(|r| res = Some(r));
599+
let res = builder.future_result();
602600
do builder.spawn {
603601
let x2 = x2.take();
604602
assert!(x2.unwrap() == ~~"hello");
605603
}
606604
assert!(x.unwrap() == ~~"hello");
607-
// See #4689 for why this can't be just "res.recv()".
608-
assert!(res.unwrap().recv() == task::Success);
605+
assert!(res.recv() == task::Success);
609606
}
610607
611608
#[test]

src/test/bench/msgsend-pipes-shared.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fn run(args: &[~str]) {
6767
for _ in range(0u, workers) {
6868
let to_child = to_child.clone();
6969
let mut builder = task::task();
70-
builder.future_result(|r| worker_results.push(r));
70+
worker_results.push(builder.future_result());
7171
do builder.spawn {
7272
for _ in range(0u, size / workers) {
7373
//error2!("worker {:?}: sending {:?} bytes", i, num_bytes);

src/test/bench/msgsend-pipes.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fn run(args: &[~str]) {
6161
for _ in range(0u, workers) {
6262
let to_child = to_child.clone();
6363
let mut builder = task::task();
64-
builder.future_result(|r| worker_results.push(r));
64+
worker_results.push(builder.future_result());
6565
do builder.spawn {
6666
for _ in range(0u, size / workers) {
6767
//error2!("worker {:?}: sending {:?} bytes", i, num_bytes);

src/test/bench/shootout-pfib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn stress(num_tasks: int) {
8484
let mut results = ~[];
8585
for i in range(0, num_tasks) {
8686
let mut builder = task::task();
87-
builder.future_result(|r| results.push(r));
87+
results.push(builder.future_result());
8888
do builder.spawn {
8989
stress_task(i);
9090
}

src/test/bench/task-perf-linked-failure.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ fn grandchild_group(num_tasks: uint) {
5454
}
5555

5656
fn spawn_supervised_blocking(myname: &str, f: ~fn()) {
57-
let mut res = None;
5857
let mut builder = task::task();
59-
builder.future_result(|r| res = Some(r));
58+
let res = builder.future_result();
6059
builder.supervised();
6160
builder.spawn(f);
6261
error2!("{} group waiting", myname);
63-
let x = res.unwrap().recv();
62+
let x = res.recv();
6463
assert_eq!(x, task::Success);
6564
}
6665

src/test/run-pass/task-comm-12.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ fn start(_task_number: int) { info2!("Started / Finished task."); }
1818

1919
fn test00() {
2020
let i: int = 0;
21-
let mut result = None;
2221
let mut builder = task::task();
23-
builder.future_result(|r| result = Some(r));
22+
let result = builder.future_result();
2423
do builder.spawn {
2524
start(i)
2625
}
@@ -33,7 +32,7 @@ fn test00() {
3332
}
3433

3534
// Try joining tasks that have already finished.
36-
result.unwrap().recv();
35+
result.recv();
3736

3837
info2!("Joined task.");
3938
}

src/test/run-pass/task-comm-3.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fn test00() {
4545
while i < number_of_tasks {
4646
let ch = ch.clone();
4747
let mut builder = task::task();
48-
builder.future_result(|r| results.push(r));
48+
results.push(builder.future_result());
4949
builder.spawn({
5050
let i = i;
5151
|| test00_start(&ch, i, number_of_messages)

src/test/run-pass/task-comm-9.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ fn test00() {
2828
let (p, ch) = comm::stream();
2929
let number_of_messages: int = 10;
3030

31-
let mut result = None;
3231
let mut builder = task::task();
33-
builder.future_result(|r| result = Some(r));
32+
let result = builder.future_result();
3433
do builder.spawn {
3534
test00_start(&ch, number_of_messages);
3635
}
@@ -42,7 +41,7 @@ fn test00() {
4241
i += 1;
4342
}
4443

45-
result.unwrap().recv();
44+
result.recv();
4645

4746
assert_eq!(sum, number_of_messages * (number_of_messages - 1) / 2);
4847
}

src/test/run-pass/yield.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@
1212
use std::task;
1313

1414
pub fn main() {
15-
let mut result = None;
1615
let mut builder = task::task();
17-
builder.future_result(|r| { result = Some(r); });
16+
let result = builder.future_result();
1817
builder.spawn(child);
1918
error2!("1");
2019
task::deschedule();
2120
error2!("2");
2221
task::deschedule();
2322
error2!("3");
24-
result.unwrap().recv();
23+
result.recv();
2524
}
2625

2726
fn child() {

src/test/run-pass/yield1.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@
1212
use std::task;
1313

1414
pub fn main() {
15-
let mut result = None;
1615
let mut builder = task::task();
17-
builder.future_result(|r| { result = Some(r); });
16+
let result = builder.future_result();
1817
builder.spawn(child);
1918
error2!("1");
2019
task::deschedule();
21-
result.unwrap().recv();
20+
result.recv();
2221
}
2322

2423
fn child() { error2!("2"); }

0 commit comments

Comments
 (0)