Skip to content

Commit 17b425d

Browse files
committed
Avoid suboptimal <pointer>::replace
There was a PR to improve it, but it was not merged for some reason. rust-lang/rust#98197
1 parent bda3891 commit 17b425d

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

bench/benches/imp/spinlock_fallback.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@ macro_rules! atomic_int {
145145
// pointer passed in is valid because we got it from a reference.
146146
unsafe {
147147
let _guard = lock(self.v.get() as usize);
148-
self.v.get().replace(val)
148+
let prev = self.v.get().read();
149+
self.v.get().write(val);
150+
prev
149151
}
150152
}
151153

src/imp/interrupt/mod.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,11 @@ impl<T> AtomicPtr<T> {
185185
// SAFETY: any data races are prevented by disabling interrupts (see
186186
// module-level comments) and the raw pointer is valid because we got it
187187
// from a reference.
188-
with(|| unsafe { self.p.get().replace(ptr) })
188+
with(|| unsafe {
189+
let prev = self.p.get().read();
190+
self.p.get().write(ptr);
191+
prev
192+
})
189193
}
190194

191195
#[inline]
@@ -406,7 +410,11 @@ macro_rules! atomic_int {
406410
// SAFETY: any data races are prevented by disabling interrupts (see
407411
// module-level comments) and the raw pointer is valid because we got it
408412
// from a reference.
409-
with(|| unsafe { self.v.get().replace(val) })
413+
with(|| unsafe {
414+
let prev = self.v.get().read();
415+
self.v.get().write(val);
416+
prev
417+
})
410418
}
411419

412420
#[inline]
@@ -685,7 +693,11 @@ macro_rules! atomic_int {
685693
// SAFETY: any data races are prevented by disabling interrupts (see
686694
// module-level comments) and the raw pointer is valid because we got it
687695
// from a reference.
688-
with(|| unsafe { self.v.get().replace(val) })
696+
with(|| unsafe {
697+
let prev = self.v.get().read();
698+
self.v.get().write(val);
699+
prev
700+
})
689701
}
690702

691703
#[inline]

0 commit comments

Comments
 (0)