@@ -343,7 +343,7 @@ Fails if the sender closes the connection.
343
343
344
344
*/
345
345
fn recv < T : send , Tbuffer : send > ( -p : recv_packet_buffered < T , Tbuffer > ) -> T {
346
- option:: unwrap ( try_recv ( p) )
346
+ option:: unwrap_expect ( try_recv ( p) , "connection closed" )
347
347
}
348
348
349
349
/** Attempts to receive a message from a pipe.
@@ -391,10 +391,13 @@ fn try_recv<T: send, Tbuffer: send>(-p: recv_packet_buffered<T, Tbuffer>)
391
391
full {
392
392
let mut payload = none;
393
393
payload <-> p. payload ;
394
+ p. header . blocked_task = none;
394
395
p. header . state = empty;
395
396
return some ( option:: unwrap ( payload) )
396
397
}
397
398
terminated {
399
+ // This assert detects when we've accidentally unsafely
400
+ // casted too big of a number to a state.
398
401
assert old_state == terminated;
399
402
return none;
400
403
}
@@ -428,10 +431,13 @@ fn sender_terminate<T: send>(p: *packet<T>) {
428
431
}
429
432
blocked {
430
433
// wake up the target
431
- let target = p. header . blocked_task . get ( ) ;
432
- rustrt:: task_signal_event ( target,
433
- ptr:: addr_of ( p. header ) as * libc:: c_void ) ;
434
-
434
+ alt p. header . blocked_task {
435
+ some ( target) =>
436
+ rustrt:: task_signal_event (
437
+ target,
438
+ ptr:: addr_of ( p. header ) as * libc:: c_void ) ,
439
+ none => { debug ! { "receiver is already shutting down" } }
440
+ }
435
441
// The receiver will eventually clean up.
436
442
//unsafe { forget(p) }
437
443
}
@@ -448,6 +454,7 @@ fn sender_terminate<T: send>(p: *packet<T>) {
448
454
#[ doc( hidden) ]
449
455
fn receiver_terminate < T : send > ( p : * packet < T > ) {
450
456
let p = unsafe { & * p } ;
457
+ assert p. header . blocked_task == none;
451
458
alt swap_state_rel ( p. header . state , terminated) {
452
459
empty {
453
460
// the sender will clean up
@@ -514,7 +521,7 @@ fn wait_many(pkts: &[*packet_header]) -> uint {
514
521
515
522
for pkts. each |p| { unsafe { ( * p) . unblock ( ) } }
516
523
517
- debug ! { "%?, %?" , ready_packet, pkts[ ready_packet] } ;
524
+ debug ! ( "%?, %?" , ready_packet, pkts[ ready_packet] ) ;
518
525
519
526
unsafe {
520
527
assert ( * pkts[ ready_packet] ) . state == full
0 commit comments