Use a u32 index for stream store (#451)
A connection can never have more than u32::MAX >> 1 streams, so we'll never store more than that many in the store slab. Define the `SlabIndex` as a `u32` to reduce the number of bytes moved around.
This commit is contained in:
@@ -30,8 +30,10 @@ pub(crate) struct Key {
|
|||||||
stream_id: StreamId,
|
stream_id: StreamId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We can never have more than `StreamId::MAX` streams in the store,
|
||||||
|
// so we can save a smaller index (u32 vs usize).
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
struct SlabIndex(usize);
|
struct SlabIndex(u32);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub(super) struct Queue<N> {
|
pub(super) struct Queue<N> {
|
||||||
@@ -102,7 +104,7 @@ impl Store {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert(&mut self, id: StreamId, val: Stream) -> Ptr {
|
pub fn insert(&mut self, id: StreamId, val: Stream) -> Ptr {
|
||||||
let index = SlabIndex(self.slab.insert(val));
|
let index = SlabIndex(self.slab.insert(val) as u32);
|
||||||
assert!(self.ids.insert(id, index).is_none());
|
assert!(self.ids.insert(id, index).is_none());
|
||||||
|
|
||||||
Ptr {
|
Ptr {
|
||||||
@@ -171,7 +173,7 @@ impl ops::Index<Key> for Store {
|
|||||||
|
|
||||||
fn index(&self, key: Key) -> &Self::Output {
|
fn index(&self, key: Key) -> &Self::Output {
|
||||||
self.slab
|
self.slab
|
||||||
.get(key.index.0)
|
.get(key.index.0 as usize)
|
||||||
.filter(|s| s.id == key.stream_id)
|
.filter(|s| s.id == key.stream_id)
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
panic!("dangling store key for stream_id={:?}", key.stream_id);
|
panic!("dangling store key for stream_id={:?}", key.stream_id);
|
||||||
@@ -182,7 +184,7 @@ impl ops::Index<Key> for Store {
|
|||||||
impl ops::IndexMut<Key> for Store {
|
impl ops::IndexMut<Key> for Store {
|
||||||
fn index_mut(&mut self, key: Key) -> &mut Self::Output {
|
fn index_mut(&mut self, key: Key) -> &mut Self::Output {
|
||||||
self.slab
|
self.slab
|
||||||
.get_mut(key.index.0)
|
.get_mut(key.index.0 as usize)
|
||||||
.filter(|s| s.id == key.stream_id)
|
.filter(|s| s.id == key.stream_id)
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
panic!("dangling store key for stream_id={:?}", key.stream_id);
|
panic!("dangling store key for stream_id={:?}", key.stream_id);
|
||||||
@@ -330,7 +332,7 @@ impl<'a> Ptr<'a> {
|
|||||||
debug_assert!(!self.store.ids.contains_key(&self.key.stream_id));
|
debug_assert!(!self.store.ids.contains_key(&self.key.stream_id));
|
||||||
|
|
||||||
// Remove the stream state
|
// Remove the stream state
|
||||||
let stream = self.store.slab.remove(self.key.index.0);
|
let stream = self.store.slab.remove(self.key.index.0 as usize);
|
||||||
assert_eq!(stream.id, self.key.stream_id);
|
assert_eq!(stream.id, self.key.stream_id);
|
||||||
stream.id
|
stream.id
|
||||||
}
|
}
|
||||||
@@ -390,7 +392,7 @@ impl<'a> VacantEntry<'a> {
|
|||||||
pub fn insert(self, value: Stream) -> Key {
|
pub fn insert(self, value: Stream) -> Key {
|
||||||
// Insert the value in the slab
|
// Insert the value in the slab
|
||||||
let stream_id = value.id;
|
let stream_id = value.id;
|
||||||
let index = SlabIndex(self.slab.insert(value));
|
let index = SlabIndex(self.slab.insert(value) as u32);
|
||||||
|
|
||||||
// Insert the handle in the ID map
|
// Insert the handle in the ID map
|
||||||
self.ids.insert(index);
|
self.ids.insert(index);
|
||||||
|
|||||||
Reference in New Issue
Block a user