Skip to content

Commit 9ebf5af

Browse files
committed
Revert "prove: RwLockReadGuard::drop"
This reverts commit 799c8ff.
1 parent 799c8ff commit 9ebf5af

1 file changed

Lines changed: 3 additions & 38 deletions

File tree

ostd/src/sync/rwlock.rs

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

10489
ghost 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 { 1int } 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 { 1int } 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 { 1int } 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(1int));
483455
g.cell_perm_resource.put_resource_left(tmp);
484456
left_token = Some(g.cell_perm_resource.split_left_without_resource(1int));
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

Comments
 (0)