@@ -182,16 +182,9 @@ impl<T: send> &mutex_arc<T> {
182
182
do ( & state. lock ) . lock_cond |cond| {
183
183
check_poison ( true , state. failed ) ;
184
184
let _z = poison_on_fail ( & mut state. failed ) ;
185
- /*
186
185
blk ( & mut state. data ,
187
186
& condvar { is_mutex : true , failed : & mut state. failed ,
188
187
cond : cond } )
189
- */
190
- // FIXME(#2282) region variance
191
- let fref =
192
- unsafe { unsafe :: transmute_mut_region ( & mut state. failed ) } ;
193
- let cvar = condvar { is_mutex : true , failed : fref, cond : cond } ;
194
- blk ( & mut state. data , unsafe { unsafe :: transmute_region ( & cvar) } )
195
188
}
196
189
}
197
190
}
@@ -302,17 +295,9 @@ impl<T: const send> &rw_arc<T> {
302
295
do borrow_rwlock(state).write_cond |cond| {
303
296
check_poison(false, state.failed);
304
297
let _z = poison_on_fail(&mut state.failed);
305
- /*
306
298
blk(&mut state.data,
307
299
&condvar { is_mutex: false, failed: &mut state.failed,
308
300
cond: cond })
309
- */
310
- // FIXME(#2282): Need region variance to use the commented-out
311
- // code above instead of this casting mess
312
- let fref =
313
- unsafe { unsafe::transmute_mut_region(&mut state.failed) };
314
- let cvar = condvar { is_mutex: false, failed: fref, cond: cond };
315
- blk(&mut state.data, unsafe { unsafe::transmute_region(&cvar) } )
316
301
}
317
302
}
318
303
/**
@@ -353,11 +338,8 @@ impl<T: const send> &rw_arc<T> {
353
338
let state = unsafe { get_shared_mutable_state(&self.x) };
354
339
do borrow_rwlock(state).write_downgrade |write_mode| {
355
340
check_poison(false, state.failed);
356
- // FIXME(#2282) need region variance to avoid having to cast here
357
- let (data,failed) =
358
- unsafe { (unsafe::transmute_mut_region(&mut state.data),
359
- unsafe::transmute_mut_region(&mut state.failed)) };
360
- blk(rw_write_mode((data, write_mode, poison_on_fail(failed))))
341
+ blk(rw_write_mode((&mut state.data, write_mode,
342
+ poison_on_fail(&mut state.failed))))
361
343
}
362
344
}
363
345
@@ -401,8 +383,8 @@ fn unwrap_rw_arc<T: const send>(+arc: rw_arc<T>) -> T {
401
383
// lock it. This wraps the unsafety, with the justification that the 'lock'
402
384
// field is never overwritten; only 'failed' and 'data'.
403
385
#[doc(hidden)]
404
- fn borrow_rwlock<T: const send>(state: &mut rw_arc_inner<T>) -> &rwlock {
405
- unsafe { unsafe::reinterpret_cast(& state.lock) }
386
+ fn borrow_rwlock<T: const send>(state: &r/ mut rw_arc_inner<T>) -> &r/ rwlock {
387
+ unsafe { unsafe::transmute_immut(&mut state.lock) }
406
388
}
407
389
408
390
// FIXME (#3154) ice with struct/&<T> prevents these from being structs.
@@ -418,9 +400,7 @@ impl<T: const send> &rw_write_mode<T> {
418
400
fn write < U > ( blk : fn ( x : & mut T ) -> U ) -> U {
419
401
match * self {
420
402
rw_write_mode( ( data, ref token, _) ) => {
421
- // FIXME(#2282) cast to avoid region invariance
422
- let mode = unsafe { unsafe :: transmute_region ( token) } ;
423
- do mode. write {
403
+ do token. write {
424
404
blk ( data)
425
405
}
426
406
}
@@ -430,13 +410,10 @@ impl<T: const send> &rw_write_mode<T> {
430
410
fn write_cond < U > ( blk : fn ( x : & x/mut T , c : & c/condvar ) -> U ) -> U {
431
411
match * self {
432
412
rw_write_mode( ( data, ref token, ref poison) ) => {
433
- // FIXME(#2282) cast to avoid region invariance
434
- let mode = unsafe { unsafe :: transmute_region ( token) } ;
435
- do mode. write_cond |cond| {
413
+ do token. write_cond |cond| {
436
414
let cvar = condvar {
437
415
is_mutex : false , failed : poison. failed ,
438
- cond : unsafe { unsafe :: reinterpret_cast ( cond) } } ;
439
- // FIXME(#2282) region variance would avoid having to cast
416
+ cond : cond } ;
440
417
blk ( data, & cvar)
441
418
}
442
419
}
@@ -449,9 +426,7 @@ impl<T: const send> &rw_read_mode<T> {
449
426
fn read < U > ( blk : fn ( x : & T ) -> U ) -> U {
450
427
match * self {
451
428
rw_read_mode( ( data, ref token) ) => {
452
- // FIXME(#2282) cast to avoid region invariance
453
- let mode = unsafe { unsafe :: transmute_region ( token) } ;
454
- do mode. read { blk ( data) }
429
+ do token. read { blk ( data) }
455
430
}
456
431
}
457
432
}
@@ -593,9 +568,7 @@ mod tests {
593
568
let arc2 = ~arc. clone ( ) ;
594
569
do task:: try {
595
570
do arc2. write_downgrade |write_mode| {
596
- // FIXME(#2282)
597
- let mode = unsafe { unsafe :: transmute_region ( & write_mode) } ;
598
- do mode. write |one| {
571
+ do ( & write_mode) . write |one| {
599
572
assert * one == 2 ;
600
573
}
601
574
}
@@ -637,9 +610,7 @@ mod tests {
637
610
do task:: try {
638
611
do arc2. write_downgrade |write_mode| {
639
612
let read_mode = arc2. downgrade ( write_mode) ;
640
- // FIXME(#2282)
641
- let mode = unsafe { unsafe :: transmute_region ( & read_mode) } ;
642
- do mode. read |one| {
613
+ do ( & read_mode) . read |one| {
643
614
assert * one == 2 ;
644
615
}
645
616
}
@@ -728,9 +699,7 @@ mod tests {
728
699
729
700
// Downgrader (us)
730
701
do arc. write_downgrade |write_mode| {
731
- // FIXME(#2282)
732
- let mode = unsafe { unsafe :: transmute_region( & write_mode) } ;
733
- do mode. write_cond |state, cond| {
702
+ do ( & write_mode) . write_cond |state, cond| {
734
703
wc1. send( ( ) ) ; // send to another writer who will wake us up
735
704
while * state == 0 {
736
705
cond. wait( ) ;
@@ -745,9 +714,7 @@ mod tests {
745
714
}
746
715
}
747
716
let read_mode = arc. downgrade( write_mode) ;
748
- // FIXME(#2282)
749
- let mode = unsafe { unsafe :: transmute_region( & read_mode) } ;
750
- do mode. read |state| {
717
+ do ( & read_mode) . read |state| {
751
718
// complete handshake with other readers
752
719
for vec:: each( reader_convos) |x| {
753
720
match x {
0 commit comments