diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-02-10 14:49:56 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-02-13 20:29:47 -0800 |
| commit | 21a064d5a340a00042c81745cc7d2a65691e84be (patch) | |
| tree | 84b16e6b5f05d3c965ec20d617521f9d19e5dc1d /src/libstd/rt/task.rs | |
| parent | aaead93c4554b685935b70565fc1bb54edd945d6 (diff) | |
| download | rust-21a064d5a340a00042c81745cc7d2a65691e84be.tar.gz rust-21a064d5a340a00042c81745cc7d2a65691e84be.zip | |
Don't require an allocation for on_exit messages
Instead, use an enum to allow running both a procedure and sending the task result over a channel. I expect the common case to be sending on a channel (e.g. task::try), so don't require an extra allocation in the common case. cc #11389
Diffstat (limited to 'src/libstd/rt/task.rs')
| -rw-r--r-- | src/libstd/rt/task.rs | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs index e2b94e655e8..0719523af77 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -17,6 +17,7 @@ use any::AnyOwnExt; use cast; use cleanup; use clone::Clone; +use comm::Chan; use io::Writer; use iter::{Iterator, Take}; use local_data; @@ -67,11 +68,17 @@ pub enum BlockedTask { Shared(UnsafeArc<AtomicUint>), } +pub enum DeathAction { + /// Action to be done with the exit code. If set, also makes the task wait + /// until all its watched children exit before collecting the status. + Execute(proc(TaskResult)), + /// A channel to send the result of the task on when the task exits + SendMessage(Chan<TaskResult>), +} + /// Per-task state related to task death, killing, failure, etc. pub struct Death { - // Action to be done with the exit code. If set, also makes the task wait - // until all its watched children exit before collecting the status. - on_exit: Option<proc(TaskResult)>, + on_exit: Option<DeathAction>, } pub struct BlockedTasks { @@ -381,7 +388,8 @@ impl Death { /// Collect failure exit codes from children and propagate them to a parent. pub fn collect_failure(&mut self, result: TaskResult) { match self.on_exit.take() { - Some(f) => f(result), + Some(Execute(f)) => f(result), + Some(SendMessage(ch)) => { ch.try_send(result); } None => {} } } |
