about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-08-07 16:54:00 -0700
committerEric Holk <eric.holk@gmail.com>2012-08-08 10:28:57 -0700
commitc5fbff01ce2b3e2d3020182891d4a22b8958f7f3 (patch)
tree53dff681944384e68ba71854289ae124f8389d58 /src
parentbc6ba6b09174fdd1feaee1ce011572ba6eb1986a (diff)
downloadrust-c5fbff01ce2b3e2d3020182891d4a22b8958f7f3.tar.gz
rust-c5fbff01ce2b3e2d3020182891d4a22b8958f7f3.zip
Add a really optimistic fast path in receive. Gives about a 7% performance improvement in msgsend-ring-pipes
Diffstat (limited to 'src')
-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);