@@ -88,6 +88,7 @@ use kinds::Owned;
88
88
use libc;
89
89
use ops:: Drop ;
90
90
use option:: { None , Option , Some } ;
91
+ use unstable:: finally:: Finally ;
91
92
use unstable:: intrinsics;
92
93
use ptr;
93
94
use task;
@@ -396,28 +397,22 @@ pub fn try_recv<T:Owned,Tbuffer:Owned>(p: RecvPacketBuffered<T, Tbuffer>)
396
397
let p_ = p.unwrap();
397
398
let p = unsafe { &*p_ };
398
399
399
- struct DropState<'self> {
400
- p: &'self PacketHeader,
401
- }
402
-
403
- #[unsafe_destructor]
404
- impl<'self> Drop for DropState<'self> {
405
- fn finalize(&self) {
406
- unsafe {
407
- if task::failing() {
408
- self.p.state = Terminated;
409
- let old_task = swap_task(&mut self.p.blocked_task,
410
- ptr::null());
411
- if !old_task.is_null() {
412
- rustrt::rust_task_deref(old_task);
413
- }
400
+ do (|| {
401
+ try_recv_(p)
402
+ }).finally {
403
+ unsafe {
404
+ if task::failing() {
405
+ p.header.state = Terminated;
406
+ let old_task = swap_task(&mut p.header.blocked_task, ptr::null());
407
+ if !old_task.is_null() {
408
+ rustrt::rust_task_deref(old_task);
414
409
}
415
410
}
416
411
}
417
412
}
413
+ }
418
414
419
- let _drop_state = DropState { p: &p.header };
420
-
415
+ fn try_recv_<T:Owned>(p: &Packet<T>) -> Option<T> {
421
416
// optimistic path
422
417
match p.header.state {
423
418
Full => {
@@ -454,7 +449,7 @@ pub fn try_recv<T:Owned,Tbuffer:Owned>(p: RecvPacketBuffered<T, Tbuffer>)
454
449
Blocked);
455
450
match old_state {
456
451
Empty => {
457
- debug!(" no data available on %?, going to sleep. ", p_ );
452
+ debug!(" no data available on %?, going to sleep. ", p );
458
453
if count == 0 {
459
454
wait_event(this);
460
455
}
0 commit comments