@@ -47,7 +47,6 @@ use crate::{
4747} ;
4848use std:: cell:: RefCell ;
4949use std:: cmp:: min;
50- use std:: collections:: BTreeMap ;
5150use std:: rc:: Rc ;
5251
5352const MAGIC : & [ u8 ; 3 ] = b"MGR" ;
@@ -228,7 +227,7 @@ struct MemoryManagerInner<M: Memory> {
228227 memory_sizes_in_pages : [ u64 ; MAX_NUM_MEMORIES as usize ] ,
229228
230229 // A map mapping each managed memory to the bucket ids that are allocated to it.
231- memory_buckets : BTreeMap < MemoryId , Vec < BucketId > > ,
230+ memory_buckets : Vec < Vec < BucketId > > ,
232231}
233232
234233impl < M : Memory > MemoryManagerInner < M > {
@@ -255,7 +254,7 @@ impl<M: Memory> MemoryManagerInner<M> {
255254 memory,
256255 allocated_buckets : 0 ,
257256 memory_sizes_in_pages : [ 0 ; MAX_NUM_MEMORIES as usize ] ,
258- memory_buckets : BTreeMap :: new ( ) ,
257+ memory_buckets : vec ! [ vec! [ ] ; MAX_NUM_MEMORIES as usize ] ,
259258 bucket_size_in_pages,
260259 } ;
261260
@@ -285,13 +284,10 @@ impl<M: Memory> MemoryManagerInner<M> {
285284 MAX_NUM_BUCKETS as usize ,
286285 ) ;
287286
288- let mut memory_buckets = BTreeMap :: new ( ) ;
287+ let mut memory_buckets = vec ! [ vec! [ ] ; MAX_NUM_MEMORIES as usize ] ;
289288 for ( bucket_idx, memory) in buckets. into_iter ( ) . enumerate ( ) {
290289 if memory != UNALLOCATED_BUCKET_MARKER {
291- memory_buckets
292- . entry ( MemoryId ( memory) )
293- . or_insert_with ( Vec :: new)
294- . push ( BucketId ( bucket_idx as u16 ) ) ;
290+ memory_buckets[ memory as usize ] . push ( BucketId ( bucket_idx as u16 ) ) ;
295291 }
296292 }
297293
@@ -336,14 +332,12 @@ impl<M: Memory> MemoryManagerInner<M> {
336332 return -1 ;
337333 }
338334
335+ let memory_bucket = & mut self . memory_buckets [ id. 0 as usize ] ;
339336 // Allocate new buckets as needed.
337+ memory_bucket. reserve ( new_buckets_needed as usize ) ;
340338 for _ in 0 ..new_buckets_needed {
341339 let new_bucket_id = BucketId ( self . allocated_buckets ) ;
342-
343- self . memory_buckets
344- . entry ( id)
345- . or_default ( )
346- . push ( new_bucket_id) ;
340+ memory_bucket. push ( new_bucket_id) ;
347341
348342 // Write in stable store that this bucket belongs to the memory with the provided `id`.
349343 write (
@@ -407,12 +401,9 @@ impl<M: Memory> MemoryManagerInner<M> {
407401 }
408402
409403 // Initializes a [`BucketIterator`].
410- fn bucket_iter ( & self , id : MemoryId , offset : u64 , length : usize ) -> BucketIterator {
404+ fn bucket_iter ( & self , MemoryId ( id ) : MemoryId , offset : u64 , length : usize ) -> BucketIterator {
411405 // Get the buckets allocated to the given memory id.
412- let buckets = match self . memory_buckets . get ( & id) {
413- Some ( s) => s. as_slice ( ) ,
414- None => & [ ] ,
415- } ;
406+ let buckets = self . memory_buckets [ id as usize ] . as_slice ( ) ;
416407
417408 BucketIterator {
418409 virtual_segment : Segment {
@@ -548,7 +539,6 @@ fn bucket_allocations_address(id: BucketId) -> Address {
548539#[ cfg( test) ]
549540mod test {
550541 use super :: * ;
551- use maplit:: btreemap;
552542 use proptest:: prelude:: * ;
553543
554544 const MAX_MEMORY_IN_PAGES : u64 = MAX_NUM_BUCKETS * BUCKET_SIZE_IN_PAGES ;
@@ -577,12 +567,11 @@ mod test {
577567 memory. read ( 0 , & mut bytes) ;
578568 assert_eq ! ( bytes, vec![ 1 , 2 , 3 ] ) ;
579569
580- assert_eq ! (
581- mem_mgr. inner. borrow( ) . memory_buckets,
582- btreemap! {
583- MemoryId ( 0 ) => vec![ BucketId ( 0 ) ]
584- }
585- ) ;
570+ assert_eq ! ( mem_mgr. inner. borrow( ) . memory_buckets[ 0 ] , vec![ BucketId ( 0 ) ] ) ;
571+
572+ assert ! ( mem_mgr. inner. borrow( ) . memory_buckets[ 1 ..]
573+ . iter( )
574+ . all( |x| x. is_empty( ) ) ) ;
586575 }
587576
588577 #[ test]
@@ -599,13 +588,14 @@ mod test {
599588 assert_eq ! ( memory_1. size( ) , 1 ) ;
600589
601590 assert_eq ! (
602- mem_mgr. inner. borrow( ) . memory_buckets,
603- btreemap! {
604- MemoryId ( 0 ) => vec![ BucketId ( 0 ) ] ,
605- MemoryId ( 1 ) => vec![ BucketId ( 1 ) ] ,
606- }
591+ & mem_mgr. inner. borrow( ) . memory_buckets[ ..2 ] ,
592+ & [ vec![ BucketId ( 0 ) ] , vec![ BucketId ( 1 ) ] , ]
607593 ) ;
608594
595+ assert ! ( mem_mgr. inner. borrow( ) . memory_buckets[ 2 ..]
596+ . iter( )
597+ . all( |x| x. is_empty( ) ) ) ;
598+
609599 memory_0. write ( 0 , & [ 1 , 2 , 3 ] ) ;
610600 memory_0. write ( 0 , & [ 1 , 2 , 3 ] ) ;
611601 memory_1. write ( 0 , & [ 4 , 5 , 6 ] ) ;
0 commit comments