diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/pipes.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 0d684a99cba..c72a777c0a8 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -395,6 +395,20 @@ fn try_recv<T: send, Tbuffer: send>(-p: recv_packet_buffered<T, Tbuffer>) { let p_ = p.unwrap(); let p = unsafe { &*p_ }; + + // optimistic path + match p.header.state { + full => { + let mut payload = none; + payload <-> p.payload; + p.header.state = empty; + return some(option::unwrap(payload)) + }, + terminated => return none, + _ => {} + } + + // regular path let this = rustrt::rust_get_task(); rustrt::task_clear_event_reject(this); rustrt::rust_task_ref(this); |
