summaryrefslogtreecommitdiffstats
path: root/third_party/rust/gpu-alloc/src/util.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/gpu-alloc/src/util.rs
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/gpu-alloc/src/util.rs')
-rw-r--r--third_party/rust/gpu-alloc/src/util.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/third_party/rust/gpu-alloc/src/util.rs b/third_party/rust/gpu-alloc/src/util.rs
new file mode 100644
index 0000000000..f02259d958
--- /dev/null
+++ b/third_party/rust/gpu-alloc/src/util.rs
@@ -0,0 +1,44 @@
+use alloc::sync::Arc;
+
+/// Guarantees uniqueness only if `Weak` pointers are never created
+/// from this `Arc` or clones.
+pub(crate) fn is_arc_unique<M>(arc: &mut Arc<M>) -> bool {
+ let strong_count = Arc::strong_count(&*arc);
+ debug_assert_ne!(strong_count, 0, "This Arc should exist");
+
+ debug_assert!(
+ strong_count > 1 || Arc::get_mut(arc).is_some(),
+ "`Weak` pointer exists"
+ );
+
+ strong_count == 1
+}
+
+/// Can be used instead of `Arc::try_unwrap(arc).unwrap()`
+/// when it is guaranteed to succeed.
+pub(crate) unsafe fn arc_unwrap<M>(mut arc: Arc<M>) -> M {
+ use core::{mem::ManuallyDrop, ptr::read};
+ debug_assert!(is_arc_unique(&mut arc));
+
+ // Get raw pointer to inner value.
+ let raw = Arc::into_raw(arc);
+
+ // As `Arc` is unique and no Weak pointers exist
+ // it won't be dereferenced elsewhere.
+ let inner = read(raw);
+
+ // Cast to `ManuallyDrop` which guarantees to have same layout
+ // and will skip dropping.
+ drop(Arc::from_raw(raw as *const ManuallyDrop<M>));
+ inner
+}
+
+/// Can be used instead of `Arc::try_unwrap`
+/// only if `Weak` pointers are never created from this `Arc` or clones.
+pub(crate) unsafe fn try_arc_unwrap<M>(mut arc: Arc<M>) -> Option<M> {
+ if is_arc_unique(&mut arc) {
+ Some(arc_unwrap(arc))
+ } else {
+ None
+ }
+}