Skip to content

Commit 77754ce

Browse files
committed
Moved use of MSRV-breaking method
1 parent 94cd9c5 commit 77754ce

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/mutex/ticket.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,17 +243,27 @@ impl<T: ?Sized, R> TicketMutex<T, R> {
243243
/// ```
244244
#[inline(always)]
245245
pub fn try_lock(&self) -> Option<TicketMutexGuard<T>> {
246-
let ticket = self
247-
.next_ticket
248-
.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |ticket| {
249-
if self.next_serving.load(Ordering::Acquire) == ticket {
250-
Some(ticket + 1)
246+
// TODO: Replace with `fetch_update` to avoid manual CAS when upgrading MSRV
247+
let ticket = {
248+
let mut prev = self.next_ticket.load(Ordering::SeqCst);
249+
loop {
250+
if self.next_serving.load(Ordering::Acquire) == prev {
251+
match self.next_ticket.compare_exchange_weak(
252+
prev,
253+
prev + 1,
254+
Ordering::SeqCst,
255+
Ordering::SeqCst,
256+
) {
257+
Ok(x) => break Some(x),
258+
Err(next_prev) => prev = next_prev,
259+
}
251260
} else {
252-
None
261+
break None;
253262
}
254-
});
263+
}
264+
};
255265

256-
ticket.ok().map(|ticket| TicketMutexGuard {
266+
ticket.map(|ticket| TicketMutexGuard {
257267
next_serving: &self.next_serving,
258268
ticket,
259269
// Safety

0 commit comments

Comments
 (0)