summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-08-10 16:17:53 -0700
committerEric Holk <eric.holk@gmail.com>2012-08-10 16:26:22 -0700
commit4808d59909b9350fcb557ec7e6f0ce21c505e803 (patch)
tree93a9bfc794b7cbff733ff83ad2dd01741c8ec3f7 /src/libcore
parent0101125a962abae18525d6014cd26ad10bbb96e6 (diff)
downloadrust-4808d59909b9350fcb557ec7e6f0ce21c505e803.tar.gz
rust-4808d59909b9350fcb557ec7e6f0ce21c505e803.zip
Terminate blocked receive packets on failure. Fixes #3168.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/pipes.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs
index 052efdf3b41..0c81c7c8244 100644
--- a/src/libcore/pipes.rs
+++ b/src/libcore/pipes.rs
@@ -396,6 +396,23 @@ fn try_recv<T: send, Tbuffer: send>(-p: recv_packet_buffered<T, Tbuffer>)
     let p_ = p.unwrap();
     let p = unsafe { &*p_ };
 
+    struct drop_state {
+        p: &packet_header;
+
+        drop {
+            if task::failing() {
+                io::println("failing!");
+                self.p.state = terminated;
+                let old_task = swap_task(self.p.blocked_task, ptr::null());
+                if !old_task.is_null() {
+                    rustrt::rust_task_deref(old_task);
+                }
+            }
+        }
+    };
+
+    let _drop_state = drop_state { p: &p.header };
+
     // optimistic path
     match p.header.state {
       full => {