From 21a6ef4c5739a534a20565ef19d7cce287dcf09b Mon Sep 17 00:00:00 2001 From: Cassy343 Date: Fri, 10 Jun 2022 08:54:06 -0400 Subject: [PATCH 1/3] Relax atomic orderings --- src/lib.rs | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 98307fc64..094529400 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -406,7 +406,7 @@ const UNINITIALIZED: usize = 0; const INITIALIZING: usize = 1; const INITIALIZED: usize = 2; -static MAX_LOG_LEVEL_FILTER: AtomicUsize = AtomicUsize::new(0); +static MAX_LOG_LEVEL_FILTER: AtomicUsize = AtomicUsize::new(LevelFilter::Off as usize); static LOG_LEVEL_NAMES: [&str; 6] = ["OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"]; @@ -1346,31 +1346,28 @@ fn set_logger_inner(make_logger: F) -> Result<(), SetLoggerError> where F: FnOnce() -> &'static dyn Log, { - let old_state = match STATE.compare_exchange( + match STATE.compare_exchange( UNINITIALIZED, INITIALIZING, - Ordering::SeqCst, - Ordering::SeqCst, + Ordering::Relaxed, + Ordering::Relaxed ) { - Ok(s) | Err(s) => s, - }; - match old_state { - UNINITIALIZED => { + Ok(UNINITIALIZED) => { unsafe { LOGGER = make_logger(); } - STATE.store(INITIALIZED, Ordering::SeqCst); + STATE.store(INITIALIZED, Ordering::Release); Ok(()) } - INITIALIZING => { - while STATE.load(Ordering::SeqCst) == INITIALIZING { + Err(INITIALIZING) => { + while STATE.load(Ordering::Relaxed) == INITIALIZING { // TODO: replace with `hint::spin_loop` once MSRV is 1.49.0. #[allow(deprecated)] std::sync::atomic::spin_loop_hint(); } Err(SetLoggerError(())) } - _ => Err(SetLoggerError(())), + _ => Err(SetLoggerError(())) } } @@ -1394,10 +1391,10 @@ where /// /// [`set_logger`]: fn.set_logger.html pub unsafe fn set_logger_racy(logger: &'static dyn Log) -> Result<(), SetLoggerError> { - match STATE.load(Ordering::SeqCst) { + match STATE.load(Ordering::Relaxed) { UNINITIALIZED => { LOGGER = logger; - STATE.store(INITIALIZED, Ordering::SeqCst); + STATE.store(INITIALIZED, Ordering::Release); Ok(()) } INITIALIZING => { @@ -1446,11 +1443,11 @@ impl error::Error for ParseLevelError {} /// /// If a logger has not been set, a no-op implementation is returned. pub fn logger() -> &'static dyn Log { - if STATE.load(Ordering::SeqCst) != INITIALIZED { + if STATE.load(Ordering::Acquire) == INITIALIZED { + unsafe { LOGGER } + } else { static NOP: NopLogger = NopLogger; &NOP - } else { - unsafe { LOGGER } } } From 78bb15d482ff90921233e2737010ba914bc0aff2 Mon Sep 17 00:00:00 2001 From: Cassy343 Date: Fri, 10 Jun 2022 09:22:12 -0400 Subject: [PATCH 2/3] Format --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 094529400..fdd8c5aab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1350,7 +1350,7 @@ where UNINITIALIZED, INITIALIZING, Ordering::Relaxed, - Ordering::Relaxed + Ordering::Relaxed, ) { Ok(UNINITIALIZED) => { unsafe { @@ -1367,7 +1367,7 @@ where } Err(SetLoggerError(())) } - _ => Err(SetLoggerError(())) + _ => Err(SetLoggerError(())), } } From 2e69066bc6986ae179fa743daef8a380836cc1cd Mon Sep 17 00:00:00 2001 From: Cassy343 Date: Fri, 10 Jun 2022 12:46:23 -0400 Subject: [PATCH 3/3] Fix potential reordering issue --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fdd8c5aab..241757d5c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1349,7 +1349,7 @@ where match STATE.compare_exchange( UNINITIALIZED, INITIALIZING, - Ordering::Relaxed, + Ordering::Acquire, Ordering::Relaxed, ) { Ok(UNINITIALIZED) => { @@ -1391,7 +1391,7 @@ where /// /// [`set_logger`]: fn.set_logger.html pub unsafe fn set_logger_racy(logger: &'static dyn Log) -> Result<(), SetLoggerError> { - match STATE.load(Ordering::Relaxed) { + match STATE.load(Ordering::Acquire) { UNINITIALIZED => { LOGGER = logger; STATE.store(INITIALIZED, Ordering::Release);