summaryrefslogtreecommitdiffstats
path: root/third_party/rust/tokio/src/util/slab/slot.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/tokio/src/util/slab/slot.rs')
-rw-r--r--third_party/rust/tokio/src/util/slab/slot.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/third_party/rust/tokio/src/util/slab/slot.rs b/third_party/rust/tokio/src/util/slab/slot.rs
new file mode 100644
index 0000000000..0608b26189
--- /dev/null
+++ b/third_party/rust/tokio/src/util/slab/slot.rs
@@ -0,0 +1,42 @@
+use crate::loom::cell::UnsafeCell;
+use crate::util::slab::{Entry, Generation};
+
+/// Stores an entry in the slab.
+pub(super) struct Slot<T> {
+ next: UnsafeCell<usize>,
+ entry: T,
+}
+
+impl<T: Entry> Slot<T> {
+ /// Initialize a new `Slot` linked to `next`.
+ ///
+ /// The entry is initialized to a default value.
+ pub(super) fn new(next: usize) -> Slot<T> {
+ Slot {
+ next: UnsafeCell::new(next),
+ entry: T::default(),
+ }
+ }
+
+ pub(super) fn get(&self) -> &T {
+ &self.entry
+ }
+
+ pub(super) fn generation(&self) -> Generation {
+ self.entry.generation()
+ }
+
+ pub(super) fn reset(&self, generation: Generation) -> bool {
+ self.entry.reset(generation)
+ }
+
+ pub(super) fn next(&self) -> usize {
+ self.next.with(|next| unsafe { *next })
+ }
+
+ pub(super) fn set_next(&self, next: usize) {
+ self.next.with_mut(|n| unsafe {
+ (*n) = next;
+ })
+ }
+}