@@ -741,98 +741,15 @@ impl<T /*: ?Sized*/, G: SpinGuardian> RwLockReadGuard<'_, T, G>
741741 ghost g => {
742742 let prev_usize = prev as usize ;
743743 let next_usize = next as usize ;
744- lemma_consts_properties_value( prev_usize ) ;
744+ lemma_consts_properties_value( next_usize ) ;
745745 lemma_consts_properties_prev_next( prev_usize, next_usize) ;
746- let ghost total_successful_readers =
747- if g. cell_perm is Left {
748- ( V_MAX_PERM_FRACS as int) - g. cell_perm->Left_0 . frac( )
749- } else {
750- 0 int
751- } ;
752- let ghost pending_failed_upgrade_attempt = g. upgrade_retract_token. is_empty( ) ;
753- let ghost upgrade_reader_count =
754- if ( prev_usize & UPGRADEABLE_READER ) != 0 && !pending_failed_upgrade_attempt {
755- 1 int
756- } else {
757- 0 int
758- } ;
759- let ghost successful_read_guards = total_successful_readers - upgrade_reader_count;
760- let ghost old_read_guard_frac = g. read_guard_token. frac( ) ;
761- assert( old_read_guard_frac + successful_read_guards == V_MAX_READ_GUARDS as int) ;
762746 g. read_guard_token. combine( token) ;
763747 g. read_guard_token. bounded( ) ;
764- assert( old_read_guard_frac + 1 int <= V_MAX_READ_GUARDS as int) ;
765- assert( old_read_guard_frac < V_MAX_READ_GUARDS as int) ;
766- assert( successful_read_guards > 0 ) ;
767- assert( total_successful_readers > 0 ) ;
768- assert( ( prev_usize & MAX_READER_MASK ) != 0 ) ;
769- if g. cell_perm is Right {
770- assert( total_successful_readers == 0 ) ;
771- assert( false ) ;
772- }
773- assert( ( prev_usize & WRITER ) == 0 ) ;
774- let ghost old_remaining_pcell_perms = g. cell_perm->Left_0 . frac( ) ;
748+
775749 let tracked mut rem = g. cell_perm. tracked_take_left( ) ;
776750 rem. combine( perm) ;
777751 rem. bounded( ) ;
778- assert( rem. frac( ) == old_remaining_pcell_perms + 1 int) ;
779- assert( ( V_MAX_PERM_FRACS as int) - rem. frac( ) == total_successful_readers - 1 int) ;
780- assert( ( next_usize & MAX_READER_MASK ) as int == ( prev_usize & MAX_READER_MASK ) as int - 1 int) ;
781- assert( ( next_usize & UPGRADEABLE_READER ) == ( prev_usize & UPGRADEABLE_READER ) ) ;
782- assert( ( next_usize & WRITER ) == ( prev_usize & WRITER ) ) ;
783- assert( ( next_usize & BEING_UPGRADED ) == ( prev_usize & BEING_UPGRADED ) ) ;
784- assert( ( next_usize & WRITER ) == 0 ) ;
785- assert( g. read_guard_token. frac( ) + ( successful_read_guards - 1 int) == V_MAX_READ_GUARDS as int) ;
786752 g. cell_perm = Sum :: new_left( rem) ;
787- let ghost next_pending_failed_upgrade_attempt = g. upgrade_retract_token. is_empty( ) ;
788- assert( next_pending_failed_upgrade_attempt == pending_failed_upgrade_attempt) ;
789- let ghost next_upgrade_reader_count =
790- if ( next_usize & UPGRADEABLE_READER ) != 0 && !next_pending_failed_upgrade_attempt {
791- 1 int
792- } else {
793- 0 int
794- } ;
795- assert( next_upgrade_reader_count == upgrade_reader_count) ;
796- let ghost next_total_successful_readers =
797- if g. cell_perm is Left {
798- ( V_MAX_PERM_FRACS as int) - g. cell_perm->Left_0 . frac( )
799- } else {
800- 0 int
801- } ;
802- assert( next_total_successful_readers == total_successful_readers - 1 int) ;
803- let ghost next_successful_read_guards = next_total_successful_readers - next_upgrade_reader_count;
804- assert( next_successful_read_guards == successful_read_guards - 1 int) ;
805- assert( g. read_guard_token. frac( ) + next_successful_read_guards == V_MAX_READ_GUARDS as int) ;
806- let ghost next_total_reader_attempts = ( next_usize & MAX_READER_MASK ) as int;
807- assert( next_total_reader_attempts == ( prev_usize & MAX_READER_MASK ) as int - 1 int) ;
808- let ghost next_reader_count =
809- if ( next_usize & MAX_READER ) != 0 {
810- MAX_READER as int
811- } else {
812- ( next_usize & READER_MASK ) as int
813- } ;
814- let ghost next_failed_reader_attempts =
815- next_total_reader_attempts + next_upgrade_reader_count - next_total_successful_readers;
816- let ghost failed_reader_attempts =
817- ( ( prev_usize & MAX_READER_MASK ) as int) + upgrade_reader_count - total_successful_readers;
818- assert( next_failed_reader_attempts == failed_reader_attempts) ;
819- assert( g. read_retract_token. frac( ) + next_failed_reader_attempts == V_MAX_READ_RETRACT_FRACS ) ;
820- assert( 0 <= next_successful_read_guards) ;
821- if ( next_usize & MAX_READER ) != 0 {
822- assert( next_reader_count == MAX_READER as int) ;
823- assert( ( next_usize & MAX_READER_MASK ) >= MAX_READER ) by ( bit_vector)
824- requires
825- ( next_usize & MAX_READER ) != 0 ,
826- ;
827- } else {
828- assert( ( next_usize & MAX_READER_MASK ) == ( next_usize & READER_MASK ) ) by ( bit_vector)
829- requires
830- ( next_usize & MAX_READER ) == 0 ,
831- ;
832- assert( next_reader_count == next_total_reader_attempts) ;
833- }
834- assert( next_reader_count <= next_total_reader_attempts) ;
835- assert( next_successful_read_guards <= next_reader_count) ;
836753 }
837754 ) ;
838755 }
0 commit comments