From a12f50ddc4ed73cbca436827ae3958a104d915d3 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Mon, 8 May 2023 15:12:45 -0700 Subject: rustc_metadata: use configurable AtomicBool for privateness flag This switches to using a `Cell` for single-threaded rustc. --- compiler/rustc_data_structures/src/sync.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'compiler/rustc_data_structures') diff --git a/compiler/rustc_data_structures/src/sync.rs b/compiler/rustc_data_structures/src/sync.rs index 6c3197d8ec2..df8285cc729 100644 --- a/compiler/rustc_data_structures/src/sync.rs +++ b/compiler/rustc_data_structures/src/sync.rs @@ -143,6 +143,20 @@ cfg_if! { self.0.set(val); result } + pub fn fetch_update( + &self, + _order_set: Ordering, + _order_get: Ordering, + mut f: impl FnMut(bool) -> Option, + ) -> Result { + let prev = self.0.get(); + if let Some(next) = f(prev) { + self.0.set(next); + Ok(prev) + } else { + Err(prev) + } + } } impl Atomic { -- cgit 1.4.1-3-g733a5 From 6a358960da438efca794020bf5497b41ce3ffe17 Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 9 May 2023 13:46:54 -0700 Subject: rustc_metadata: specialize private_dep flag with `fetch_and` --- compiler/rustc_data_structures/src/sync.rs | 17 ++++------------- compiler/rustc_metadata/src/creader.rs | 2 +- compiler/rustc_metadata/src/rmeta/decoder.rs | 7 ++----- 3 files changed, 7 insertions(+), 19 deletions(-) (limited to 'compiler/rustc_data_structures') diff --git a/compiler/rustc_data_structures/src/sync.rs b/compiler/rustc_data_structures/src/sync.rs index df8285cc729..96dc187611d 100644 --- a/compiler/rustc_data_structures/src/sync.rs +++ b/compiler/rustc_data_structures/src/sync.rs @@ -143,19 +143,10 @@ cfg_if! { self.0.set(val); result } - pub fn fetch_update( - &self, - _order_set: Ordering, - _order_get: Ordering, - mut f: impl FnMut(bool) -> Option, - ) -> Result { - let prev = self.0.get(); - if let Some(next) = f(prev) { - self.0.set(next); - Ok(prev) - } else { - Err(prev) - } + pub fn fetch_and(&self, val: bool, _: Ordering) -> bool { + let result = self.0.get() & val; + self.0.set(val); + result } } diff --git a/compiler/rustc_metadata/src/creader.rs b/compiler/rustc_metadata/src/creader.rs index 63a2dc5aa62..4c872664c3d 100644 --- a/compiler/rustc_metadata/src/creader.rs +++ b/compiler/rustc_metadata/src/creader.rs @@ -570,7 +570,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> { } data.update_dep_kind(|data_dep_kind| cmp::max(data_dep_kind, dep_kind)); if let Some(private_dep) = private_dep { - data.update_private_dep(|p_d| p_d && private_dep); + data.update_and_private_dep(private_dep); } Ok(cnum) } diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index 325ffcae7e9..d2995b198f6 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -1668,11 +1668,8 @@ impl CrateMetadata { self.dep_kind.with_lock(|dep_kind| *dep_kind = f(*dep_kind)) } - /// `f` must not perform any I/O or take any locks. It may be called more than once. - pub(crate) fn update_private_dep(&self, mut f: impl FnMut(bool) -> bool) { - self.private_dep - .fetch_update(Ordering::Release, Ordering::Acquire, |private_dep| Some(f(private_dep))) - .expect("fetch_update only returns Err if `f` returns None`, which it doesn't"); + pub(crate) fn update_and_private_dep(&self, private_dep: bool) { + self.private_dep.fetch_and(private_dep, Ordering::SeqCst); } pub(crate) fn required_panic_strategy(&self) -> Option { -- cgit 1.4.1-3-g733a5 From 52bd82f522c4f3d9bd0dc534c06169285afbc23b Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Thu, 25 May 2023 15:18:05 -0700 Subject: rustc_data_structures: sync and atomic consistency Co-authored-by: @lukas-code --- compiler/rustc_data_structures/src/sync.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'compiler/rustc_data_structures') diff --git a/compiler/rustc_data_structures/src/sync.rs b/compiler/rustc_data_structures/src/sync.rs index 96dc187611d..25a08237346 100644 --- a/compiler/rustc_data_structures/src/sync.rs +++ b/compiler/rustc_data_structures/src/sync.rs @@ -139,14 +139,14 @@ cfg_if! { impl Atomic { pub fn fetch_or(&self, val: bool, _: Ordering) -> bool { - let result = self.0.get() | val; - self.0.set(val); - result + let old = self.0.get(); + self.0.set(val | old); + old } pub fn fetch_and(&self, val: bool, _: Ordering) -> bool { - let result = self.0.get() & val; - self.0.set(val); - result + let old = self.0.get(); + self.0.set(val & old); + old } } -- cgit 1.4.1-3-g733a5