24
24
#define POOL_ALIGN_INDEX (POOL_ALIGN_BITS - POOL_MIN_BITS)
25
25
#define POOL_ALIGN_MASK (POOL_ALIGN - 1)
26
26
27
+ #define BLOCK_USED 1
28
+
27
29
/// When we mmap, pull at least this many bytes.
28
30
#ifdef PLATFORM_IS_ILP32
29
31
# define POOL_MMAP (16 * 1024 * 1024) // 16 MB
@@ -79,7 +81,6 @@ typedef struct pool_block_t
79
81
};
80
82
size_t size ;
81
83
PONY_ATOMIC (bool ) acquired ;
82
- bool used ;
83
84
84
85
#if defined(_MSC_VER )
85
86
pool_block_t () { }
@@ -427,6 +428,27 @@ bool ponyint_pool_mem_pressure()
427
428
return false;
428
429
}
429
430
431
+ static void set_block_used (pool_block_t * block )
432
+ {
433
+ block -> size = (block -> size | BLOCK_USED );
434
+ }
435
+
436
+ static bool block_is_used (pool_block_t * block )
437
+ {
438
+ return (block -> size & BLOCK_USED ) == BLOCK_USED ;
439
+ }
440
+
441
+ static void set_block_size (pool_block_t * block , size_t new_size )
442
+ {
443
+ // make sure to retain `used` marker
444
+ block -> size = (new_size | (block -> size & BLOCK_USED ));
445
+ }
446
+
447
+ static size_t block_size (pool_block_t * block )
448
+ {
449
+ return block -> size & ~BLOCK_USED ;
450
+ }
451
+
430
452
static void pool_block_remove (pool_block_t * block )
431
453
{
432
454
pool_block_t * prev = block -> prev ;
@@ -448,7 +470,7 @@ static void pool_block_insert(pool_block_t* block)
448
470
449
471
while (next != NULL )
450
472
{
451
- if (block -> size <= next -> size )
473
+ if (block_size ( block ) <= block_size ( next ) )
452
474
break ;
453
475
454
476
prev = next ;
@@ -486,7 +508,7 @@ static void pool_block_push(pool_block_t* block)
486
508
// Find an insertion position. The list is sorted and stays sorted after an
487
509
// insertion.
488
510
pool_block_t * prev = & pool_block_global ;
489
- while ((pos != NULL ) && (block -> size > pos -> size ))
511
+ while ((pos != NULL ) && (block_size ( block ) > block_size ( pos ) ))
490
512
{
491
513
prev = pos ;
492
514
pos = atomic_load_explicit (& pos -> global , memory_order_acquire );
@@ -562,7 +584,7 @@ static pool_block_t* pool_block_pull( size_t size)
562
584
pool_block_t * prev = & pool_block_global ;
563
585
564
586
// Find a big enough block. The list is sorted.
565
- while ((block != NULL ) && (size > block -> size ))
587
+ while ((block != NULL ) && (size > block_size ( block ) ))
566
588
{
567
589
prev = block ;
568
590
block = atomic_load_explicit (& block -> global , memory_order_acquire );
@@ -629,7 +651,7 @@ static pool_block_t* pool_block_pull( size_t size)
629
651
ANNOTATE_HAPPENS_AFTER (& in_pool_block_global );
630
652
#endif
631
653
632
- pony_assert (size <= block -> size );
654
+ pony_assert (size <= block_size ( block ) );
633
655
634
656
#ifdef USE_VALGRIND
635
657
ANNOTATE_HAPPENS_BEFORE_FORGET_ALL (& block -> global );
@@ -647,23 +669,23 @@ static void* pool_block_get(size_t size)
647
669
648
670
while (block != NULL )
649
671
{
650
- if (block -> size > size )
672
+ if (block_size ( block ) > size )
651
673
{
652
674
// Use size bytes from the end of the block. This allows us to keep the
653
675
// block info inside the block instead of using another data structure.
654
- size_t rem = block -> size - size ;
655
- block -> size = rem ;
676
+ size_t rem = block_size ( block ) - size ;
677
+ set_block_size ( block , rem ) ;
656
678
pool_block_header .total_size -= size ;
657
679
658
- if (should_track_mem_allocated && (! block -> used ))
680
+ if (should_track_mem_allocated && ! block_is_used ( block ))
659
681
track_mem_allocated (size );
660
682
661
- if ((block -> prev != NULL ) && (block -> prev -> size > block -> size ))
683
+ if ((block -> prev != NULL ) && (block_size ( block -> prev ) > block_size ( block ) ))
662
684
{
663
685
// If we are now smaller than the previous block, move us forward in
664
686
// the list.
665
687
if (block -> next == NULL )
666
- pool_block_header .largest_size = block -> prev -> size ;
688
+ pool_block_header .largest_size = block_size ( block -> prev ) ;
667
689
668
690
pool_block_remove (block );
669
691
pool_block_insert (block );
@@ -672,15 +694,15 @@ static void* pool_block_get(size_t size)
672
694
}
673
695
674
696
return (char * )block + rem ;
675
- } else if (block -> size == size ) {
697
+ } else if (block_size ( block ) == size ) {
676
698
if (block -> next == NULL )
677
699
{
678
700
pool_block_header .largest_size =
679
- (block -> prev == NULL ) ? 0 : block -> prev -> size ;
701
+ (block -> prev == NULL ) ? 0 : block_size ( block -> prev ) ;
680
702
}
681
703
682
704
// count memory being given to the app
683
- if (should_track_mem_allocated && (! block -> used ))
705
+ if (should_track_mem_allocated && ! block_is_used ( block ))
684
706
track_mem_allocated (size );
685
707
686
708
// Remove the block from the list.
@@ -704,14 +726,14 @@ static void* pool_block_get(size_t size)
704
726
return NULL ;
705
727
706
728
// count memory being given to the app
707
- if (should_track_mem_allocated && (! block -> used ))
729
+ if (should_track_mem_allocated && ! block_is_used ( block ))
708
730
track_mem_allocated (size );
709
731
710
- if (size == block -> size )
732
+ if (size == block_size ( block ) )
711
733
return block ;
712
734
713
- size_t rem = block -> size - size ;
714
- block -> size = rem ;
735
+ size_t rem = block_size ( block ) - size ;
736
+ set_block_size ( block , rem ) ;
715
737
pool_block_insert (block );
716
738
pool_block_header .total_size += rem ;
717
739
@@ -739,10 +761,10 @@ static void* pool_alloc_pages(size_t size)
739
761
pool_block_t * block = (pool_block_t * )ponyint_virt_alloc (POOL_MMAP );
740
762
size_t rem = POOL_MMAP - size ;
741
763
764
+ pony_assert ((rem & BLOCK_USED ) == 0 );
742
765
block -> size = rem ;
743
766
block -> next = NULL ;
744
767
block -> prev = NULL ;
745
- block -> used = false;
746
768
pool_block_insert (block );
747
769
pool_block_header .total_size += rem ;
748
770
if (pool_block_header .largest_size < rem )
@@ -758,11 +780,12 @@ static void pool_free_pages(void* p, size_t size)
758
780
// TODO: ???
759
781
}
760
782
783
+ pony_assert ((size & BLOCK_USED ) == 0 );
761
784
pool_block_t * block = (pool_block_t * )p ;
762
785
block -> prev = NULL ;
763
786
block -> next = NULL ;
764
787
block -> size = size ;
765
- block -> used = true ;
788
+ set_block_used ( block ) ;
766
789
767
790
pool_block_insert (block );
768
791
pool_block_header .total_size += size ;
0 commit comments