diff options
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/kill.rs | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/libstd/rt/kill.rs b/src/libstd/rt/kill.rs index deec8dd37a6..3372c13b877 100644 --- a/src/libstd/rt/kill.rs +++ b/src/libstd/rt/kill.rs @@ -193,6 +193,10 @@ impl BlockedTask { /// Create a blocked task, unless the task was already killed. pub fn try_block(mut task: ~Task) -> Either<~Task, BlockedTask> { + // NB: As an optimization, we could give a free pass to being unkillable + // to tasks whose taskgroups haven't been initialized yet, but that + // introduces complications with select() and with the test cases below, + // and it's not clear the uncommon performance boost is worth it. if task.death.unkillable > 0 { Right(Unkillable(task)) } else { @@ -205,11 +209,10 @@ impl BlockedTask { let flag_arc = match task.death.spare_kill_flag.take() { Some(spare_flag) => spare_flag, None => { - // FIXME(#7544): Uncomment this when terminate_current_task - // stops being *terrible*. That's the only place that violates - // the assumption of "becoming unkillable will fail if the - // task was killed". - // rtassert!(task.unwinder.unwinding); + // A task that kills us won't have a spare kill flag to + // give back to us, so we restore it ourselves here. This + // situation should only arise when we're already failing. + rtassert!(task.unwinder.unwinding); (*task.death.kill_handle.get_ref().get()).killed.clone() } }; |
