aboutsummaryrefslogtreecommitdiff
path: root/src/util/slab/shard.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/slab/shard.rs')
-rw-r--r--src/util/slab/shard.rs105
1 files changed, 0 insertions, 105 deletions
diff --git a/src/util/slab/shard.rs b/src/util/slab/shard.rs
deleted file mode 100644
index eaca6f6..0000000
--- a/src/util/slab/shard.rs
+++ /dev/null
@@ -1,105 +0,0 @@
-use crate::util::slab::{page, Address, Entry, MAX_PAGES};
-
-use std::fmt;
-
-// ┌─────────────┐ ┌────────┐
-// │ page 1 │ │ │
-// ├─────────────┤ ┌───▶│ next──┼─┐
-// │ page 2 │ │ ├────────┤ │
-// │ │ │ │XXXXXXXX│ │
-// │ local_free──┼─┘ ├────────┤ │
-// │ global_free─┼─┐ │ │◀┘
-// ├─────────────┤ └───▶│ next──┼─┐
-// │ page 3 │ ├────────┤ │
-// └─────────────┘ │XXXXXXXX│ │
-// ... ├────────┤ │
-// ┌─────────────┐ │XXXXXXXX│ │
-// │ page n │ ├────────┤ │
-// └─────────────┘ │ │◀┘
-// │ next──┼───▶
-// ├────────┤
-// │XXXXXXXX│
-// └────────┘
-// ...
-pub(super) struct Shard<T> {
- /// The local free list for each page.
- ///
- /// These are only ever accessed from this shard's thread, so they are
- /// stored separately from the shared state for the page that can be
- /// accessed concurrently, to minimize false sharing.
- local: Box<[page::Local]>,
- /// The shared state for each page in this shard.
- ///
- /// This consists of the page's metadata (size, previous size), remote free
- /// list, and a pointer to the actual array backing that page.
- shared: Box<[page::Shared<T>]>,
-}
-
-impl<T: Entry> Shard<T> {
- pub(super) fn new() -> Shard<T> {
- let mut total_sz = 0;
- let shared = (0..MAX_PAGES)
- .map(|page_num| {
- let sz = page::size(page_num);
- let prev_sz = total_sz;
- total_sz += sz;
- page::Shared::new(sz, prev_sz)
- })
- .collect();
-
- let local = (0..MAX_PAGES).map(|_| page::Local::new()).collect();
-
- Shard { local, shared }
- }
-
- pub(super) fn alloc(&self) -> Option<Address> {
- // Can we fit the value into an existing page?
- for (page_idx, page) in self.shared.iter().enumerate() {
- let local = self.local(page_idx);
-
- if let Some(page_offset) = page.alloc(local) {
- return Some(page_offset);
- }
- }
-
- None
- }
-
- pub(super) fn get(&self, addr: Address) -> Option<&T> {
- let page_idx = addr.page();
-
- if page_idx > self.shared.len() {
- return None;
- }
-
- self.shared[page_idx].get(addr)
- }
-
- /// Remove an item on the shard's local thread.
- pub(super) fn remove_local(&self, addr: Address) {
- let page_idx = addr.page();
-
- if let Some(page) = self.shared.get(page_idx) {
- page.remove_local(self.local(page_idx), addr);
- }
- }
-
- /// Remove an item, while on a different thread from the shard's local thread.
- pub(super) fn remove_remote(&self, addr: Address) {
- if let Some(page) = self.shared.get(addr.page()) {
- page.remove_remote(addr);
- }
- }
-
- fn local(&self, i: usize) -> &page::Local {
- &self.local[i]
- }
-}
-
-impl<T> fmt::Debug for Shard<T> {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("Shard")
- .field("shared", &self.shared)
- .finish()
- }
-}