about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/pipes.rs14
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);