diff --git a/src/race.rs b/src/race.rs index 27014d6..fbaaef0 100644 --- a/src/race.rs +++ b/src/race.rs @@ -442,22 +442,27 @@ mod once_box { where F: FnOnce() -> Result, E>, { - let mut ptr = self.inner.load(Ordering::Acquire); + match self.get() { + Some(val) => Ok(val), + None => self.init(f) + } + } - if ptr.is_null() { - let val = f()?; - ptr = Box::into_raw(val); - let exchange = self.inner.compare_exchange( - ptr::null_mut(), - ptr, - Ordering::Release, - Ordering::Acquire, - ); - if let Err(old) = exchange { - drop(unsafe { Box::from_raw(ptr) }); - ptr = old; - } - }; + #[cold] + #[inline(never)] + fn init(&self, f: impl FnOnce() -> Result, E>) -> Result<&T, E> { + let val = f()?; + let mut ptr = Box::into_raw(val); + let exchange = self.inner.compare_exchange( + ptr::null_mut(), + ptr, + Ordering::Release, + Ordering::Acquire, + ); + if let Err(old) = exchange { + drop(unsafe { Box::from_raw(ptr) }); + ptr = old; + } Ok(unsafe { &*ptr }) } }