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, | ||||
| } | ||||
|  | ||||
| // 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)] | ||||
| struct SlabIndex(usize); | ||||
| struct SlabIndex(u32); | ||||
|  | ||||
| #[derive(Debug)] | ||||
| pub(super) struct Queue<N> { | ||||
| @@ -102,7 +104,7 @@ impl Store { | ||||
|     } | ||||
|  | ||||
|     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()); | ||||
|  | ||||
|         Ptr { | ||||
| @@ -171,7 +173,7 @@ impl ops::Index<Key> for Store { | ||||
|  | ||||
|     fn index(&self, key: Key) -> &Self::Output { | ||||
|         self.slab | ||||
|             .get(key.index.0) | ||||
|             .get(key.index.0 as usize) | ||||
|             .filter(|s| s.id == key.stream_id) | ||||
|             .unwrap_or_else(|| { | ||||
|                 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 { | ||||
|     fn index_mut(&mut self, key: Key) -> &mut Self::Output { | ||||
|         self.slab | ||||
|             .get_mut(key.index.0) | ||||
|             .get_mut(key.index.0 as usize) | ||||
|             .filter(|s| s.id == key.stream_id) | ||||
|             .unwrap_or_else(|| { | ||||
|                 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)); | ||||
|  | ||||
|         // 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); | ||||
|         stream.id | ||||
|     } | ||||
| @@ -390,7 +392,7 @@ impl<'a> VacantEntry<'a> { | ||||
|     pub fn insert(self, value: Stream) -> Key { | ||||
|         // Insert the value in the slab | ||||
|         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 | ||||
|         self.ids.insert(index); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user