diff options
Diffstat (limited to 'src/libcore/pipes.rs')
| -rw-r--r-- | src/libcore/pipes.rs | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 95b24d20a4b..19674900f90 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -86,7 +86,9 @@ use cast::{forget, transmute, transmute_copy}; use either::{Either, Left, Right}; use kinds::Owned; use libc; +use ops::Drop; use option::{None, Option, Some}; +use unstable::finally::Finally; use unstable::intrinsics; use ptr; use task; @@ -301,7 +303,7 @@ struct BufferResource<T> { } #[unsafe_destructor] -impl<T> ::ops::Drop for BufferResource<T> { +impl<T> Drop for BufferResource<T> { fn finalize(&self) { unsafe { let b = move_it!(self.buffer); @@ -395,26 +397,22 @@ pub fn try_recv<T:Owned,Tbuffer:Owned>(p: RecvPacketBuffered<T, Tbuffer>) let p_ = p.unwrap(); let p = unsafe { &*p_ }; - #[unsafe_destructor] - struct DropState<'self> { - p: &'self PacketHeader, - - drop { - unsafe { - if task::failing() { - self.p.state = Terminated; - let old_task = swap_task(&mut self.p.blocked_task, - ptr::null()); - if !old_task.is_null() { - rustrt::rust_task_deref(old_task); - } + do (|| { + try_recv_(p) + }).finally { + unsafe { + if task::failing() { + p.header.state = Terminated; + let old_task = swap_task(&mut p.header.blocked_task, ptr::null()); + if !old_task.is_null() { + rustrt::rust_task_deref(old_task); } } } - }; - - let _drop_state = DropState { p: &p.header }; + } +} +fn try_recv_<T:Owned>(p: &Packet<T>) -> Option<T> { // optimistic path match p.header.state { Full => { @@ -451,7 +449,7 @@ pub fn try_recv<T:Owned,Tbuffer:Owned>(p: RecvPacketBuffered<T, Tbuffer>) Blocked); match old_state { Empty => { - debug!("no data available on %?, going to sleep.", p_); + debug!("no data available on %?, going to sleep.", p); if count == 0 { wait_event(this); } @@ -641,7 +639,7 @@ pub struct SendPacketBuffered<T, Tbuffer> { } #[unsafe_destructor] -impl<T:Owned,Tbuffer:Owned> ::ops::Drop for SendPacketBuffered<T,Tbuffer> { +impl<T:Owned,Tbuffer:Owned> Drop for SendPacketBuffered<T,Tbuffer> { fn finalize(&self) { //if self.p != none { // debug!("drop send %?", option::get(self.p)); @@ -710,7 +708,7 @@ pub struct RecvPacketBuffered<T, Tbuffer> { } #[unsafe_destructor] -impl<T:Owned,Tbuffer:Owned> ::ops::Drop for RecvPacketBuffered<T,Tbuffer> { +impl<T:Owned,Tbuffer:Owned> Drop for RecvPacketBuffered<T,Tbuffer> { fn finalize(&self) { //if self.p != none { // debug!("drop recv %?", option::get(self.p)); |
