summaryrefslogtreecommitdiffstats
path: root/tokio/src/util/slab/generation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tokio/src/util/slab/generation.rs')
-rw-r--r--tokio/src/util/slab/generation.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/tokio/src/util/slab/generation.rs b/tokio/src/util/slab/generation.rs
new file mode 100644
index 00000000..4b16b2ca
--- /dev/null
+++ b/tokio/src/util/slab/generation.rs
@@ -0,0 +1,32 @@
+use crate::util::bit;
+use crate::util::slab::Address;
+
+/// An mutation identifier for a slot in the slab. The generation helps prevent
+/// accessing an entry with an outdated token.
+#[derive(Copy, Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
+pub(crate) struct Generation(usize);
+
+impl Generation {
+ pub(crate) const WIDTH: u32 = Address::GENERATION_WIDTH;
+
+ pub(super) const MAX: usize = bit::mask_for(Address::GENERATION_WIDTH);
+
+ /// Create a new generation
+ ///
+ /// # Panics
+ ///
+ /// Panics if `value` is greater than max generation.
+ pub(crate) fn new(value: usize) -> Generation {
+ assert!(value <= Self::MAX);
+ Generation(value)
+ }
+
+ /// Returns the next generation value
+ pub(crate) fn next(self) -> Generation {
+ Generation((self.0 + 1) & Self::MAX)
+ }
+
+ pub(crate) fn to_usize(self) -> usize {
+ self.0
+ }
+}