Auto merge of #52349 - RalfJung:once, r=alexcrichton
sync::Once use release-acquire access modes Nothing here makes a case distinction like "this happened before OR after that". All we need is to get happens-before edges whenever we see that the state/signal has been changed. Release-acquire is good enough for that.
This commit is contained in:
commit
bc14d71622
@ -220,7 +220,11 @@ impl Once {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn call_once<F>(&self, f: F) where F: FnOnce() {
|
pub fn call_once<F>(&self, f: F) where F: FnOnce() {
|
||||||
// Fast path, just see if we've completed initialization.
|
// Fast path, just see if we've completed initialization.
|
||||||
if self.state.load(Ordering::SeqCst) == COMPLETE {
|
// An `Acquire` load is enough because that makes all the initialization
|
||||||
|
// operations visible to us. The cold path uses SeqCst consistently
|
||||||
|
// because the performance difference really does not matter there,
|
||||||
|
// and SeqCst minimizes the chances of something going wrong.
|
||||||
|
if self.state.load(Ordering::Acquire) == COMPLETE {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,7 +281,11 @@ impl Once {
|
|||||||
#[unstable(feature = "once_poison", issue = "33577")]
|
#[unstable(feature = "once_poison", issue = "33577")]
|
||||||
pub fn call_once_force<F>(&self, f: F) where F: FnOnce(&OnceState) {
|
pub fn call_once_force<F>(&self, f: F) where F: FnOnce(&OnceState) {
|
||||||
// same as above, just with a different parameter to `call_inner`.
|
// same as above, just with a different parameter to `call_inner`.
|
||||||
if self.state.load(Ordering::SeqCst) == COMPLETE {
|
// An `Acquire` load is enough because that makes all the initialization
|
||||||
|
// operations visible to us. The cold path uses SeqCst consistently
|
||||||
|
// because the performance difference really does not matter there,
|
||||||
|
// and SeqCst minimizes the chances of something going wrong.
|
||||||
|
if self.state.load(Ordering::Acquire) == COMPLETE {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user