Skip to content

Commit 3d502fc

Browse files
committed
prove: try_upgrade
1 parent 423e2da commit 3d502fc

1 file changed

Lines changed: 13 additions & 13 deletions

File tree

ostd/src/sync/rwlock.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)