@@ -47,7 +47,6 @@ use crate::{
47
47
} ;
48
48
use std:: cell:: RefCell ;
49
49
use std:: cmp:: min;
50
- use std:: collections:: BTreeMap ;
51
50
use std:: rc:: Rc ;
52
51
53
52
const MAGIC : & [ u8 ; 3 ] = b"MGR" ;
@@ -228,7 +227,7 @@ struct MemoryManagerInner<M: Memory> {
228
227
memory_sizes_in_pages : [ u64 ; MAX_NUM_MEMORIES as usize ] ,
229
228
230
229
// 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 > > ,
232
231
}
233
232
234
233
impl < M : Memory > MemoryManagerInner < M > {
@@ -255,7 +254,7 @@ impl<M: Memory> MemoryManagerInner<M> {
255
254
memory,
256
255
allocated_buckets : 0 ,
257
256
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 ] ,
259
258
bucket_size_in_pages,
260
259
} ;
261
260
@@ -285,13 +284,10 @@ impl<M: Memory> MemoryManagerInner<M> {
285
284
MAX_NUM_BUCKETS as usize ,
286
285
) ;
287
286
288
- let mut memory_buckets = BTreeMap :: new ( ) ;
287
+ let mut memory_buckets = vec ! [ vec! [ ] ; MAX_NUM_MEMORIES as usize ] ;
289
288
for ( bucket_idx, memory) in buckets. into_iter ( ) . enumerate ( ) {
290
289
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 ) ) ;
295
291
}
296
292
}
297
293
@@ -336,14 +332,12 @@ impl<M: Memory> MemoryManagerInner<M> {
336
332
return -1 ;
337
333
}
338
334
335
+ let memory_bucket = & mut self . memory_buckets [ id. 0 as usize ] ;
339
336
// Allocate new buckets as needed.
337
+ memory_bucket. reserve ( new_buckets_needed as usize ) ;
340
338
for _ in 0 ..new_buckets_needed {
341
339
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) ;
347
341
348
342
// Write in stable store that this bucket belongs to the memory with the provided `id`.
349
343
write (
@@ -407,12 +401,9 @@ impl<M: Memory> MemoryManagerInner<M> {
407
401
}
408
402
409
403
// 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 {
411
405
// 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 ( ) ;
416
407
417
408
BucketIterator {
418
409
virtual_segment : Segment {
@@ -548,7 +539,6 @@ fn bucket_allocations_address(id: BucketId) -> Address {
548
539
#[ cfg( test) ]
549
540
mod test {
550
541
use super :: * ;
551
- use maplit:: btreemap;
552
542
use proptest:: prelude:: * ;
553
543
554
544
const MAX_MEMORY_IN_PAGES : u64 = MAX_NUM_BUCKETS * BUCKET_SIZE_IN_PAGES ;
@@ -577,12 +567,11 @@ mod test {
577
567
memory. read ( 0 , & mut bytes) ;
578
568
assert_eq ! ( bytes, vec![ 1 , 2 , 3 ] ) ;
579
569
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( ) ) ) ;
586
575
}
587
576
588
577
#[ test]
@@ -599,13 +588,14 @@ mod test {
599
588
assert_eq ! ( memory_1. size( ) , 1 ) ;
600
589
601
590
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 ) ] , ]
607
593
) ;
608
594
595
+ assert ! ( mem_mgr. inner. borrow( ) . memory_buckets[ 2 ..]
596
+ . iter( )
597
+ . all( |x| x. is_empty( ) ) ) ;
598
+
609
599
memory_0. write ( 0 , & [ 1 , 2 , 3 ] ) ;
610
600
memory_0. write ( 0 , & [ 1 , 2 , 3 ] ) ;
611
601
memory_1. write ( 0 , & [ 4 , 5 , 6 ] ) ;
0 commit comments