Skip to content

Commit 8dce55f

Browse files
committed
Relax SeqCst in heph-inbox
This replaces all SeqCst atomic operations with Release, Acquire or AcqRel. Also see rust-lang/rust#122729.
1 parent 7ed5678 commit 8dce55f

File tree

4 files changed

+13
-13
lines changed

4 files changed

+13
-13
lines changed

inbox/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ fn try_send<T>(channel: &Channel<T>, value: T) -> Result<(), SendError<T>> {
401401
/// enough for most practical use cases.
402402
impl<T> Clone for Sender<T> {
403403
fn clone(&self) -> Sender<T> {
404-
// For the reasoning behind this relaxed ordering see `Arc::clone`.
404+
// SAFETY: for the reasoning behind this relaxed ordering see `Arc::clone`.
405405
let old_ref_count = self.channel().ref_count.fetch_add(1, Ordering::Relaxed);
406406
debug_assert!(old_ref_count & SENDER_ACCESS != 0);
407407
Sender {
@@ -452,7 +452,7 @@ impl<T> Drop for Sender<T> {
452452
return;
453453
}
454454

455-
// For the reasoning behind this ordering see `Arc::drop`.
455+
// SAFETY: for the reasoning behind this ordering see `Arc::drop`.
456456
fence!(self.channel().ref_count, Ordering::Acquire);
457457

458458
// Drop the memory.

inbox/src/tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct AwokenCount {
2222

2323
impl PartialEq<usize> for AwokenCount {
2424
fn eq(&self, other: &usize) -> bool {
25-
self.inner.count.load(Ordering::SeqCst) == *other
25+
self.inner.count.load(Ordering::Acquire) == *other
2626
}
2727
}
2828

@@ -33,11 +33,11 @@ struct WakerInner {
3333

3434
impl Wake for WakerInner {
3535
fn wake(self: Arc<Self>) {
36-
let _ = self.count.fetch_add(1, Ordering::SeqCst);
36+
let _ = self.count.fetch_add(1, Ordering::AcqRel);
3737
}
3838

3939
fn wake_by_ref(self: &Arc<Self>) {
40-
let _ = self.count.fetch_add(1, Ordering::SeqCst);
40+
let _ = self.count.fetch_add(1, Ordering::AcqRel);
4141
}
4242
}
4343

inbox/src/waker.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl WakerRegistration {
2424
let stored_waker = self.waker.read().unwrap();
2525
if let Some(stored_waker) = &*stored_waker {
2626
if stored_waker.will_wake(waker) {
27-
self.needs_wakeup.store(true, Ordering::SeqCst);
27+
self.needs_wakeup.store(true, Ordering::Release);
2828
return false;
2929
}
3030
}
@@ -36,26 +36,26 @@ impl WakerRegistration {
3636
// again.
3737
if let Some(stored_waker) = &*stored_waker {
3838
if stored_waker.will_wake(waker) {
39-
self.needs_wakeup.store(true, Ordering::SeqCst);
39+
self.needs_wakeup.store(true, Ordering::Release);
4040
return false;
4141
}
4242
}
4343
*stored_waker = Some(waker.clone());
4444
drop(stored_waker);
4545

46-
self.needs_wakeup.store(true, Ordering::SeqCst);
46+
self.needs_wakeup.store(true, Ordering::Release);
4747
true
4848
}
4949

5050
/// Wake the waker registered, if required.
5151
pub(crate) fn wake(&self) {
52-
if !self.needs_wakeup.load(Ordering::SeqCst) {
52+
if !self.needs_wakeup.load(Ordering::Acquire) {
5353
// Receiver doesn't need a wake-up.
5454
return;
5555
}
5656

5757
// Mark that we've woken and after actually do the waking.
58-
if self.needs_wakeup.swap(false, Ordering::SeqCst) {
58+
if self.needs_wakeup.swap(false, Ordering::AcqRel) {
5959
if let Some(waker) = &*self.waker.read().unwrap() {
6060
waker.wake_by_ref();
6161
}

inbox/tests/util/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub struct AwokenCount {
2222
impl AwokenCount {
2323
/// Get the current count.
2424
pub fn get(&self) -> usize {
25-
self.inner.count.load(Ordering::SeqCst)
25+
self.inner.count.load(Ordering::Acquire)
2626
}
2727
}
2828

@@ -39,11 +39,11 @@ struct WakerInner {
3939

4040
impl Wake for WakerInner {
4141
fn wake(self: Arc<Self>) {
42-
let _ = self.count.fetch_add(1, Ordering::SeqCst);
42+
let _ = self.count.fetch_add(1, Ordering::AcqRel);
4343
}
4444

4545
fn wake_by_ref(self: &Arc<Self>) {
46-
let _ = self.count.fetch_add(1, Ordering::SeqCst);
46+
let _ = self.count.fetch_add(1, Ordering::AcqRel);
4747
}
4848
}
4949

0 commit comments

Comments
 (0)