summaryrefslogtreecommitdiffstats
path: root/vendor/regex-automata-0.2.0/src/util/lazy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/regex-automata-0.2.0/src/util/lazy.rs')
-rw-r--r--vendor/regex-automata-0.2.0/src/util/lazy.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/vendor/regex-automata-0.2.0/src/util/lazy.rs b/vendor/regex-automata-0.2.0/src/util/lazy.rs
new file mode 100644
index 000000000..d8cac6ef4
--- /dev/null
+++ b/vendor/regex-automata-0.2.0/src/util/lazy.rs
@@ -0,0 +1,31 @@
+use core::{
+ cell::Cell,
+ ptr,
+ sync::atomic::{AtomicPtr, Ordering},
+};
+
+use alloc::{boxed::Box, vec::Vec};
+
+#[inline(always)]
+pub(crate) fn get_or_init<T: Send + Sync + 'static>(
+ location: &'static AtomicPtr<T>,
+ init: impl FnOnce() -> T,
+) -> &'static T {
+ let mut ptr = location.load(Ordering::Acquire);
+ if ptr.is_null() {
+ let new_dfa = Box::new(init());
+ ptr = Box::into_raw(new_dfa);
+ let result = location.compare_exchange(
+ ptr::null_mut(),
+ ptr,
+ Ordering::AcqRel,
+ Ordering::Acquire,
+ );
+ if let Err(old) = result {
+ let redundant = unsafe { Box::from_raw(ptr) };
+ drop(redundant);
+ ptr = old;
+ }
+ }
+ unsafe { &*ptr }
+}