@@ -117,6 +117,8 @@ struct packet_header {
117
117
}
118
118
119
119
unsafe fn unblock ( ) {
120
+ assert self. state != blocked || self . blocked_task != none;
121
+ self . blocked_task = none;
120
122
alt swap_state_acq ( self . state , empty) {
121
123
empty | blocked { }
122
124
terminated { self . state = terminated; }
@@ -322,7 +324,7 @@ fn send<T: send, Tbuffer: send>(-p: send_packet_buffered<T, Tbuffer>,
322
324
rustrt:: task_signal_event (
323
325
task, ptr:: addr_of ( p. header ) as * libc:: c_void ) ;
324
326
}
325
- none { fail ~"blocked packet has no task" }
327
+ none { debug! { "just kidding!" } }
326
328
}
327
329
328
330
// The receiver will eventually clean this up.
@@ -878,23 +880,28 @@ struct port_set<T: send> : recv<T> {
878
880
879
881
fn try_recv ( ) -> option < T > {
880
882
let mut result = none;
881
- while result == none && self . ports . len ( ) > 0 {
882
- let i = wait_many ( self . ports . map ( |p| p. header ( ) ) ) ;
883
- // dereferencing an unsafe pointer nonsense to appease the
884
- // borrowchecker.
885
- alt move unsafe { ( * ptr:: addr_of ( self . ports [ i] ) ) . try_recv ( ) } {
886
- some ( m) {
887
- result = some ( move_it ! { m} ) ;
888
- }
889
- none {
890
- // Remove this port.
891
- let mut ports = ~[ ] ;
892
- self . ports <-> ports;
893
- vec:: consume ( ports,
894
- |j, x| if i != j { vec:: push ( self . ports , x) } ) ;
895
- }
883
+ // we have to swap the ports array so we aren't borrowing
884
+ // aliasable mutable memory.
885
+ let mut ports = ~[ ] ;
886
+ ports <-> self . ports ;
887
+ while result == none && ports. len ( ) > 0 {
888
+ let i = wait_many ( ports. map ( |p| p. header ( ) ) ) ;
889
+ alt move ports[ i] . try_recv ( ) {
890
+ some ( m) {
891
+ result = some ( move m) ;
892
+ }
893
+ none {
894
+ // Remove this port.
895
+ let mut ports_ = ~[ ] ;
896
+ ports <-> ports_;
897
+ vec:: consume ( ports_,
898
+ |j, x| if i != j {
899
+ vec:: push ( ports, x)
900
+ } ) ;
901
+ }
896
902
}
897
903
}
904
+ ports <-> self . ports ;
898
905
result
899
906
}
900
907
0 commit comments