diff options
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/comm.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libstd/rt/comm.rs b/src/libstd/rt/comm.rs index 46c99d21d9d..f098f8b2767 100644 --- a/src/libstd/rt/comm.rs +++ b/src/libstd/rt/comm.rs @@ -286,8 +286,14 @@ impl<T> Drop for PortOneHack<T> { STATE_ONE => { let _packet: ~Packet<T> = cast::transmute(this.void_packet); } - _ => { - util::unreachable() + task_as_state => { + // This case occurs during unwinding, when the blocked + // receiver was killed awake. The task can't still be + // blocked (we are it), but we need to free the handle. + let recvr = BlockedTask::cast_from_uint(task_as_state); + // FIXME(#7554)(bblum): Make this cfg(test) dependent. + // in a later commit. + assert!(recvr.wake().is_none()); } } } |
