@@ -365,9 +365,11 @@ pub impl<T:Const + Owned> RWARC<T> {
365
365
let state = get_shared_mutable_state(&self.x);
366
366
do (*borrow_rwlock(state)).write_downgrade |write_mode| {
367
367
check_poison(false, (*state).failed);
368
- blk(RWWriteMode((&mut (*state).data,
369
- write_mode,
370
- PoisonOnFail(&mut (*state).failed))))
368
+ blk(RWWriteMode {
369
+ data: &mut (*state).data,
370
+ token: write_mode,
371
+ poison: PoisonOnFail(&mut (*state).failed)
372
+ })
371
373
}
372
374
}
373
375
}
@@ -376,7 +378,11 @@ pub impl<T:Const + Owned> RWARC<T> {
376
378
fn downgrade(&self, token: RWWriteMode/&a<T>) -> RWReadMode/&a<T> {
377
379
// The rwlock should assert that the token belongs to us for us.
378
380
let state = unsafe { get_shared_immutable_state(&self.x) };
379
- let RWWriteMode((data, t, _poison)) = token;
381
+ let RWWriteMode {
382
+ data: data,
383
+ token: t,
384
+ poison: _poison
385
+ } = token;
380
386
// Let readers in
381
387
let new_token = (&state.lock).downgrade(t);
382
388
// Whatever region the input reference had, it will be safe to use
@@ -386,7 +392,10 @@ pub impl<T:Const + Owned> RWARC<T> {
386
392
// Downgrade ensured the token belonged to us. Just a sanity check.
387
393
fail_unless!(ptr::ref_eq(&state.data, new_data));
388
394
// Produce new token
389
- RWReadMode((new_data, new_token))
395
+ RWReadMode {
396
+ data: new_data,
397
+ token: new_token,
398
+ }
390
399
}
391
400
}
392
401
@@ -398,19 +407,28 @@ fn borrow_rwlock<T:Const + Owned>(state: *const RWARCInner<T>) -> *RWlock {
398
407
unsafe { cast::transmute(&const (*state).lock) }
399
408
}
400
409
401
- // FIXME (#3154) ice with struct/&<T> prevents these from being structs.
402
-
403
410
/// The " write permission" token used for RWARC.write_downgrade().
404
- pub enum RWWriteMode<T> =
405
- (&self/mut T, sync::RWlockWriteMode/&self, PoisonOnFail);
411
+ pub struct RWWriteMode<'self, T> {
412
+ data: &'self mut T,
413
+ token: sync::RWlockWriteMode<'self>,
414
+ poison: PoisonOnFail,
415
+ }
416
+
406
417
/// The " read permission" token used for RWARC . write_downgrade( ) .
407
- pub enum RWReadMode <T > = ( & self /T , sync:: RWlockReadMode /& self ) ;
418
+ pub struct RWReadMode <' self , T > {
419
+ data: & ' self T ,
420
+ token: sync:: RWlockReadMode <' self >,
421
+ }
408
422
409
423
pub impl <T : Const + Owned > RWWriteMode /& self <T > {
410
424
/// Access the pre-downgrade RWARC in write mode.
411
425
fn write<U >( & self , blk: & fn ( x: & mut T ) -> U ) -> U {
412
426
match * self {
413
- RWWriteMode ( ( ref data, ref token, _) ) => {
427
+ RWWriteMode {
428
+ data: ref data,
429
+ token: ref token,
430
+ poison: _
431
+ } => {
414
432
do token. write {
415
433
blk( & mut * * data)
416
434
}
@@ -420,7 +438,11 @@ pub impl<T:Const + Owned> RWWriteMode/&self<T> {
420
438
/// Access the pre-downgrade RWARC in write mode with a condvar.
421
439
fn write_cond<U >( & self , blk: & fn ( x: & x/mut T , c: & c/Condvar ) -> U ) -> U {
422
440
match * self {
423
- RWWriteMode ( ( ref data, ref token, ref poison) ) => {
441
+ RWWriteMode {
442
+ data: ref data,
443
+ token: ref token,
444
+ poison: ref poison
445
+ } => {
424
446
do token. write_cond |cond| {
425
447
unsafe {
426
448
let cvar = Condvar {
@@ -440,7 +462,10 @@ pub impl<T:Const + Owned> RWReadMode/&self<T> {
440
462
/// Access the post-downgrade rwlock in read mode.
441
463
fn read<U >( & self , blk: & fn ( x: & T ) -> U ) -> U {
442
464
match * self {
443
- RWReadMode ( ( data, ref token) ) => {
465
+ RWReadMode {
466
+ data: data,
467
+ token: ref token
468
+ } => {
444
469
do token. read { blk( data) }
445
470
}
446
471
}
0 commit comments