@@ -67,19 +67,6 @@ exec const V_MAX_READ_RETRACT_FRACS: u64
6767 ( MAX_READER_MASK + 1 ) as u64
6868}
6969
70- spec const V_MAX_READ_GUARDS_SPEC : u64 = MAX_READER as u64 ;
71-
72- #[ verifier:: when_used_as_spec( V_MAX_READ_GUARDS_SPEC ) ]
73- exec const V_MAX_READ_GUARDS : u64
74- ensures
75- V_MAX_READ_GUARDS == V_MAX_READ_GUARDS_SPEC ,
76- V_MAX_READ_GUARDS == MAX_READER ,
77- V_MAX_READ_GUARDS < u64 :: MAX ,
78- {
79- assert( MAX_READER < u64 :: MAX ) by ( compute_only) ;
80- MAX_READER as u64
81- }
82-
8370tracked struct RwPerms <T > {
8471 /// The permission of the `PCell<T>`.
8572 /// In the reading state, it can be splited up to `V_MAX_PERM_FRACS:= MAX_READER + 2` pieces,
@@ -97,8 +84,6 @@ tracked struct RwPerms<T> {
9784 upread_retract_token: UniqueTokenStorage ,
9885 /// Tracks whether there is a live `RwLockUpgradeableGuard`.
9986 upreader_guard_token: UniqueTokenStorage ,
100- /// Tracks the number of live `RwLockReadGuard`s.
101- read_guard_token: TokenStorage <V_MAX_READ_GUARDS >,
10287}
10388
10489ghost struct RwId {
@@ -107,7 +92,6 @@ ghost struct RwId {
10792 upread_retract_token_id: Loc ,
10893 upreader_guard_token_id: Loc ,
10994 read_retract_token_id: Loc ,
110- read_guard_token_id: Loc ,
11195}
11296
11397/// The number of `try_read` operations recorded in the lock atomic (created and ongoing) can never reach `2*MAX_READER` to avoid overflow.
@@ -240,7 +224,7 @@ closed spec fn wf(self) -> bool {
240224 // The number of active `RwLockUpgradeableGuard`, which can only be 0 or 1.
241225 let active_upgrade_guard: bool = g. upreader_guard_token. is_empty( ) ;
242226 // The number of active `RwLockReadGuard`s.
243- let active_read_guards: int = V_MAX_READ_GUARDS - g . read_guard_token . frac ( ) ;
227+ let active_read_guards: int = total_active_readers - if active_upgrade_guard { 1 int } else { 0 } ;
244228 // The first `try_upread` that fails, which has not returned yet.
245229 let pending_failed_upread_attempt: bool = g. upread_retract_token. is_empty( ) ;
246230 // The number of `try_read` attempts that will fail.
@@ -250,8 +234,6 @@ closed spec fn wf(self) -> bool {
250234 &&& has_upgrade_bit <==> ( active_upgrade_guard || pending_failed_upread_attempt)
251235 // An active `RwLockUpgradeableGuard` cannot coexist with a pending failed `try_upread` attempt.
252236 &&& !( active_upgrade_guard && pending_failed_upread_attempt)
253- // Active readers are split into plain readers plus at most one upgradeable reader.
254- &&& total_active_readers == active_read_guards + if active_upgrade_guard { 1 int } else { 0 }
255237 // The `READER` bits count the number of all active readers and pending failed `try_read` attempts.
256238 &&& total_reader_bits + if active_upgrade_guard { 1 int } else { 0 } == total_active_readers + failed_reader_attempts
257239 // There is an active `RwLockWriteGuard` iff the `WRITER` bit is set.
@@ -264,7 +246,6 @@ closed spec fn wf(self) -> bool {
264246 &&& g. cell_perm_resource. wf( )
265247 &&& g. upread_retract_token. wf( )
266248 &&& g. upreader_guard_token. wf( )
267- &&& g. read_guard_token. wf( )
268249 &&& g. cell_perm_resource. is_resource_owner( )
269250 &&& g. cell_perm_resource. has_resource( )
270251 &&& g. cell_perm_resource. is_left( ) ==> {
@@ -281,7 +262,6 @@ closed spec fn wf(self) -> bool {
281262 &&& v_id@. upread_retract_token_id == g. upread_retract_token. id( )
282263 &&& v_id@. upreader_guard_token_id == g. upreader_guard_token. id( )
283264 &&& v_id@. read_retract_token_id == g. read_retract_token. id( )
284- &&& v_id@. read_guard_token_id == g. read_guard_token. id( )
285265 &&& v_id@. cell_perm_resource_id == g. cell_perm_resource. id( )
286266 }
287267}
@@ -336,10 +316,6 @@ impl<T, G> RwLock<T, G> {
336316 self . v_id@. upreader_guard_token_id
337317 }
338318
339- pub closed spec fn read_guard_token_id( self ) -> Loc {
340- self . v_id@. read_guard_token_id
341- }
342-
343319 /// Encapsulates the invariant described in the *Invariant* section of [`RwLock`].
344320 #[ verifier:: type_invariant]
345321 pub closed spec fn type_inv( self ) -> bool {
@@ -363,22 +339,19 @@ impl<T, G> RwLock<T, G> {
363339 let tracked read_retract_token = TokenStorage :: <V_MAX_READ_RETRACT_FRACS >:: alloc( ( ) ) ;
364340 let tracked upread_retract_token = UniqueTokenStorage :: alloc( ( ) ) ;
365341 let tracked upreader_guard_token = UniqueTokenStorage :: alloc( ( ) ) ;
366- let tracked read_guard_token = TokenStorage :: <V_MAX_READ_GUARDS >:: alloc( ( ) ) ;
367342 }
368343 let ghost v_id = RwId {
369344 frac_id,
370345 cell_perm_resource_id: cell_perm_resource. id( ) ,
371346 upread_retract_token_id: upread_retract_token. id( ) ,
372347 upreader_guard_token_id: upreader_guard_token. id( ) ,
373348 read_retract_token_id: read_retract_token. id( ) ,
374- read_guard_token_id: read_guard_token. id( ) ,
375349 } ;
376350 let tracked perms = RwPerms {
377351 cell_perm_resource,
378352 read_retract_token,
379353 upread_retract_token,
380354 upreader_guard_token,
381- read_guard_token,
382355 } ;
383356
384357 Self {
@@ -458,7 +431,6 @@ impl<T /*: ?Sized*/ , G: SpinGuardian> RwLock<T, G> {
458431 let tracked mut perm: Option <RwFrac <T >> = None ;
459432 let tracked mut retract_read_token: Option <Token <V_MAX_READ_RETRACT_FRACS >> = None ;
460433 let tracked mut left_token = None ;
461- let tracked mut read_guard_token: Option <Token <V_MAX_READ_GUARDS >> = None ;
462434 }
463435 proof!{
464436 use_type_invariant( self ) ;
@@ -482,7 +454,6 @@ impl<T /*: ?Sized*/ , G: SpinGuardian> RwLock<T, G> {
482454 perm = Some ( tmp. split( 1 int) ) ;
483455 g. cell_perm_resource. put_resource_left( tmp) ;
484456 left_token = Some ( g. cell_perm_resource. split_left_without_resource( 1 int) ) ;
485- read_guard_token = Some ( g. read_guard_token. split_one( ) ) ;
486457 } else {
487458 retract_read_token = Some ( g. read_retract_token. split_one( ) ) ;
488459 }
@@ -494,7 +465,6 @@ impl<T /*: ?Sized*/ , G: SpinGuardian> RwLock<T, G> {
494465 guard,
495466 v_perm: Tracked ( perm. tracked_unwrap( ) ) ,
496467 v_cell_token: Tracked ( left_token. tracked_unwrap( ) ) ,
497- v_read_token: Tracked ( read_guard_token. tracked_unwrap( ) ) ,
498468 } )
499469 } else {
500470 // self.lock.fetch_sub(READER, Release);
@@ -677,7 +647,6 @@ pub struct RwLockReadGuard<'a, T /*: ?Sized*/, G: SpinGuardian> {
677647 inner : & ' a RwLock < T , G > ,
678648 v_perm : Tracked < RwFrac < T > > ,
679649 v_cell_token : Tracked < Left < RwFrac < T > , NoPerm < T > , V_MAX_PERM_FRACS > > ,
680- v_read_token : Tracked < Token < V_MAX_READ_GUARDS > > ,
681650}
682651
683652/*
@@ -696,10 +665,8 @@ impl<'a, T, G: SpinGuardian> RwLockReadGuard<'a, T, G> {
696665 &&& self . inner. cell_perm_resource_id( ) == self . v_cell_token@. id( )
697666 &&& self . inner. frac_id( ) == self . v_perm@. id( )
698667 &&& self . inner. cell_id( ) == self . v_perm@. resource( ) . id( )
699- &&& self . inner. read_guard_token_id( ) == self . v_read_token@. id( )
700668 &&& self . v_perm@. frac( ) == 1
701669 &&& self . v_cell_token@. frac( ) == 1
702- &&& self . v_read_token@. frac( ) == 1
703670 &&& !self . v_cell_token@. is_resource_owner( )
704671 }
705672}
@@ -749,18 +716,16 @@ impl<T /*: ?Sized*/, G: SpinGuardian> RwLockReadGuard<'_, T, G>
749716 }
750717 let Tracked ( perm) = self . v_perm;
751718 let Tracked ( token) = self . v_cell_token;
752- let Tracked ( read_token) = self . v_read_token;
753719 // self.inner.lock.fetch_sub(READER, Release);
754720 atomic_with_ghost!(
755721 self . inner. lock => fetch_sub( READER ) ;
756722 update prev -> next;
757723 ghost g => {
758- let prev_usize = # [ verifier :: truncate ] ( prev as usize ) ;
759- let next_usize = # [ verifier :: truncate ] ( next as usize ) ;
724+ let prev_usize = prev as usize ;
725+ let next_usize = next as usize ;
760726 lemma_consts_properties_value( prev_usize) ;
761727 lemma_consts_properties_value( next_usize) ;
762728 lemma_consts_properties_prev_next( prev_usize, next_usize) ;
763- g. read_guard_token. combine( read_token) ;
764729 g. cell_perm_resource. validate_with_left( & token) ;
765730 g. cell_perm_resource. join_left( token) ;
766731 let tracked mut rem = g. cell_perm_resource. take_resource_left( ) ;
0 commit comments