From 9e020b8b8f0f40ae905f44320009d6d067a60510 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 17 Aug 2011 15:07:19 -0700 Subject: [PATCH] Convenience methods for spawning and joining tasks. --- src/lib/task.rs | 19 +++++++++++++++++-- src/test/stdtest/task.rs | 8 ++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lib/task.rs b/src/lib/task.rs index d3f26ce769b..4ad160df603 100644 --- a/src/lib/task.rs +++ b/src/lib/task.rs @@ -73,8 +73,17 @@ tag task_notification { exit(task, task_result); } -fn join(t: task) -> task_result { - join_id(cast(t)) +fn join(task_port : (task_id, comm::port)) + -> task_result { + let (id, port) = task_port; + while true { + alt comm::recv::(port) { + exit(_id, res) { + if _id == id { ret res } + } + } + } + fail } fn join_id(t : task_id) -> task_result { @@ -104,6 +113,12 @@ fn spawn_notify(thunk : -fn() -> (), notify : _chan) spawn_inner(thunk, some(notify)) } +fn spawn_joinable(thunk : -fn()) -> (task_id, comm::port) { + let p = comm::port::(); + let id = spawn_notify(thunk, comm::chan::(p)); + ret (id, p); +} + // FIXME: make this a fn~ once those are supported. fn spawn_inner(thunk : -fn() -> (), notify : option<_chan>) diff --git a/src/test/stdtest/task.rs b/src/test/stdtest/task.rs index 6e6c2e0673f..517210b9c56 100644 --- a/src/test/stdtest/task.rs +++ b/src/test/stdtest/task.rs @@ -72,3 +72,11 @@ fn test_join_chan_fail() { _ { fail "invalid task status received" } } } + +#[test] +fn test_join_convenient() { + fn winner() { } + let f = winner; + let handle = task::spawn_joinable(f); + assert(task::tr_success == task::join(handle)); +}