@@ -169,7 +169,7 @@ fn try_recv<T: send>(-p: recv_packet<T>) -> option<T> {
169
169
170
170
/// Returns true if messages are available.
171
171
pure fn peek < T : send > ( p : recv_packet < T > ) -> bool {
172
- alt p. header ( ) . state {
172
+ alt unsafe { ( * p. header ( ) ) . state } {
173
173
empty { false }
174
174
blocked { fail "peeking on blocked packet" }
175
175
full | terminated { true }
@@ -219,14 +219,16 @@ fn receiver_terminate<T: send>(p: *packet<T>) {
219
219
}
220
220
}
221
221
222
- impl private_methods for packet_header {
222
+ impl private_methods for * packet_header {
223
223
// Returns the old state.
224
- fn mark_blocked ( this : * rust_task ) -> state {
224
+ unsafe fn mark_blocked ( this : * rust_task ) -> state {
225
+ let self = & * self ;
225
226
self . blocked_task = some ( this) ;
226
227
swap_state_acq ( self . state , blocked)
227
228
}
228
229
229
- fn unblock ( ) {
230
+ unsafe fn unblock ( ) {
231
+ let self = & * self ;
230
232
alt swap_state_acq ( self . state , empty) {
231
233
empty | blocked { }
232
234
terminated { self . state = terminated; }
@@ -237,19 +239,19 @@ impl private_methods for packet_header {
237
239
238
240
#[ doc = "Returns when one of the packet headers reports data is
239
241
available." ]
240
- fn wait_many ( pkts : & [ & a . packet_header ] ) -> uint {
242
+ fn wait_many ( pkts : & [ * packet_header ] ) -> uint {
241
243
let this = rustrt:: rust_get_task ( ) ;
242
244
243
245
rustrt:: task_clear_event_reject ( this) ;
244
246
let mut data_avail = false ;
245
247
let mut ready_packet = pkts. len ( ) ;
246
- for pkts. eachi |i, p| {
248
+ for pkts. eachi |i, p| unsafe {
247
249
let old = p. mark_blocked( this) ;
248
250
alt old {
249
251
full | terminated {
250
252
data_avail = true;
251
253
ready_packet = i;
252
- p . state = old;
254
+ ( * p ) . state = old;
253
255
break ;
254
256
}
255
257
blocked { fail "blocking on blocked packet" }
@@ -260,7 +262,7 @@ fn wait_many(pkts: &[&a.packet_header]) -> uint {
260
262
while !data_avail {
261
263
#debug( "sleeping on %? packets" , pkts. len( ) ) ;
262
264
let event = wait_event( this) as * packet_header;
263
- let pos = vec:: position ( pkts, |p| ptr :: addr_of ( * p ) == event) ;
265
+ let pos = vec:: position( pkts, |p| p == event) ;
264
266
265
267
alt pos {
266
268
some( i) {
@@ -275,12 +277,14 @@ fn wait_many(pkts: &[&a.packet_header]) -> uint {
275
277
276
278
#debug( "%?" , pkts[ ready_packet] ) ;
277
279
278
- for pkts. each |p| { p. unblock ( ) }
280
+ for pkts. each |p| { unsafe { p. unblock( ) } }
279
281
280
282
#debug( "%?, %?" , ready_packet, pkts[ ready_packet] ) ;
281
283
282
- assert pkts[ ready_packet] . state == full
283
- || pkts[ ready_packet] . state == terminated;
284
+ unsafe {
285
+ assert ( * pkts[ ready_packet] ) . state == full
286
+ || ( * pkts[ ready_packet] ) . state == terminated;
287
+ }
284
288
285
289
ready_packet
286
290
}
@@ -370,12 +374,12 @@ class recv_packet<T: send> {
370
374
option:: unwrap ( p)
371
375
}
372
376
373
- pure fn header( ) -> & self . packet_header {
377
+ pure fn header( ) -> * packet_header {
374
378
alt self. p {
375
379
some( packet) {
376
380
unsafe {
377
381
let packet = uniquify ( packet) ;
378
- let header = reinterpret_cast ( & packet. header ) ;
382
+ let header = ptr :: addr_of ( packet. header ) ;
379
383
forget ( packet) ;
380
384
header
381
385
}
0 commit comments