@@ -835,10 +835,9 @@ impl<'a, T /*: ?Sized*/, G: SpinGuardian> RwLockUpgradeableGuard<'a, T, G>
835835 /// This function is not exposed publicly because the `BEING_UPGRADED` bit
836836 /// is set only in [`Self::upgrade`].
837837 #[ verus_spec]
838- #[ verifier:: external_body]
839838 fn try_upgrade( /* mut */ self ) -> Result <RwLockWriteGuard <' a, T , G >, Self > {
840839 proof_decl! {
841- let tracked mut lock_perm : Option <RwFrac <T >> = None ;
840+ let tracked mut up_perm : Option <RwFrac <T >> = None ;
842841 let tracked mut write_perm: Option <PointsTo <T >> = None ;
843842 }
844843 let lock = self . inner;
@@ -847,6 +846,12 @@ impl<'a, T /*: ?Sized*/, G: SpinGuardian> RwLockUpgradeableGuard<'a, T, G>
847846 use_type_invariant( lock) ;
848847 lemma_consts_properties( ) ;
849848 }
849+ let this = core:: mem:: ManuallyDrop :: new( self ) ;
850+ let guard = unsafe { Self :: get_guard( & this) } ;
851+ let Tracked ( up_perm0) = unsafe { Self :: get_v_perm( & this) } ;
852+ proof! {
853+ up_perm = Some ( up_perm0) ;
854+ }
850855 // let res = self.inner.lock.compare_exchange(
851856 // UPGRADEABLE_READER | BEING_UPGRADED,
852857 // WRITER | UPGRADEABLE_READER,
@@ -860,27 +865,22 @@ impl<'a, T /*: ?Sized*/, G: SpinGuardian> RwLockUpgradeableGuard<'a, T, G>
860865 ghost g => {
861866 lemma_consts_properties_prev_next( prev, next) ;
862867 if res is Ok {
863- lock_perm = Some ( g. cell_perm. tracked_take_left( ) ) ;
868+ let tracked mut rem = g. cell_perm. tracked_take_left( ) ;
869+ rem. combine( up_perm. tracked_take( ) ) ;
870+ let tracked ( full_perm, empty) = rem. take_resource( ) ;
871+ write_perm = Some ( full_perm) ;
872+ g. cell_perm = Sum :: new_right( empty) ;
864873 }
865874 }
866875 ) ;
867876 if res. is_ok( ) {
868877 // let inner = self.inner;
869878 // let guard = self.guard.transfer_to();
870879 // drop(self);
871- let mut this = core:: mem:: ManuallyDrop :: new( self ) ;
872880 let inner = & this. inner;
873- let guard = unsafe { Self :: get_guard( & this) } ;
874- let Tracked ( up_perm) = unsafe { Self :: get_v_perm( & this) } ;
875- proof! {
876- let tracked mut rem = lock_perm. tracked_unwrap( ) ;
877- rem. combine( up_perm) ;
878- let tracked ( full_perm, _) = rem. take_resource( ) ;
879- write_perm = Some ( full_perm) ;
880- }
881881 Ok ( RwLockWriteGuard { inner, guard, v_perm: Tracked ( write_perm. tracked_unwrap( ) ) } )
882882 } else {
883- Err ( self )
883+ Err ( RwLockUpgradeableGuard { inner : lock , guard , v_perm : Tracked ( up_perm . tracked_unwrap ( ) ) } )
884884 }
885885 }
886886
0 commit comments