diff --git a/libs/utils/src/sync/heavier_once_cell.rs b/libs/utils/src/sync/heavier_once_cell.rs index edcdb1c3b104..e444a4dc286e 100644 --- a/libs/utils/src/sync/heavier_once_cell.rs +++ b/libs/utils/src/sync/heavier_once_cell.rs @@ -262,13 +262,17 @@ impl<'a, T> Guard<'a, T> { impl Inner { pub fn take_and_deinit(&mut self) -> Option<(T, InitPermit)> { + let Some(value) = self.value.take() else { + return None; + }; + let mut swapped = Inner::default(); let sem = swapped.init_semaphore.clone(); // acquire and forget right away, moving the control over to InitPermit sem.try_acquire().expect("we just created this").forget(); - std::mem::swap(self, &mut swapped); let permit = InitPermit(sem); - swapped.value.map(|v| (v, permit)) + std::mem::swap(self, &mut swapped); + Some((value, permit)) } }