summaryrefslogtreecommitdiffstats
path: root/third_party/rust/tokio/src/util/slab/stack.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/tokio/src/util/slab/stack.rs
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/tokio/src/util/slab/stack.rs')
-rw-r--r--third_party/rust/tokio/src/util/slab/stack.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/third_party/rust/tokio/src/util/slab/stack.rs b/third_party/rust/tokio/src/util/slab/stack.rs
new file mode 100644
index 0000000000..0ae0d71006
--- /dev/null
+++ b/third_party/rust/tokio/src/util/slab/stack.rs
@@ -0,0 +1,58 @@
+use crate::loom::sync::atomic::AtomicUsize;
+use crate::util::slab::Address;
+
+use std::fmt;
+use std::sync::atomic::Ordering;
+use std::usize;
+
+pub(super) struct TransferStack {
+ head: AtomicUsize,
+}
+
+impl TransferStack {
+ pub(super) fn new() -> Self {
+ Self {
+ head: AtomicUsize::new(Address::NULL),
+ }
+ }
+
+ pub(super) fn pop_all(&self) -> Option<usize> {
+ let val = self.head.swap(Address::NULL, Ordering::Acquire);
+
+ if val == Address::NULL {
+ None
+ } else {
+ Some(val)
+ }
+ }
+
+ pub(super) fn push(&self, value: usize, before: impl Fn(usize)) {
+ let mut next = self.head.load(Ordering::Relaxed);
+
+ loop {
+ before(next);
+
+ match self
+ .head
+ .compare_exchange(next, value, Ordering::AcqRel, Ordering::Acquire)
+ {
+ // lost the race!
+ Err(actual) => next = actual,
+ Ok(_) => return,
+ }
+ }
+ }
+}
+
+impl fmt::Debug for TransferStack {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ // Loom likes to dump all its internal state in `fmt::Debug` impls, so
+ // we override this to just print the current value in tests.
+ f.debug_struct("TransferStack")
+ .field(
+ "head",
+ &format_args!("{:#x}", self.head.load(Ordering::Relaxed)),
+ )
+ .finish()
+ }
+}