@@ -216,6 +216,19 @@ struct mp_block {
216
216
uintmax_t space [FLEX_ARRAY ]; /* more */
217
217
};
218
218
219
+ struct mem_pool {
220
+ struct mp_block * mp_block ;
221
+
222
+ /*
223
+ * The amount of available memory to grow the pool by.
224
+ * This size does not include the overhead for the mp_block.
225
+ */
226
+ size_t block_alloc ;
227
+
228
+ /* The total amount of memory allocated by the pool. */
229
+ size_t pool_alloc ;
230
+ };
231
+
219
232
struct atom_str {
220
233
struct atom_str * next_atom ;
221
234
unsigned short str_len ;
@@ -304,9 +317,7 @@ static int global_argc;
304
317
static const char * * global_argv ;
305
318
306
319
/* Memory pools */
307
- static size_t mem_pool_alloc = 2 * 1024 * 1024 - sizeof (struct mp_block );
308
- static size_t total_allocd ;
309
- static struct mp_block * mp_block_head ;
320
+ static struct mem_pool fi_mem_pool = {0 , 2 * 1024 * 1024 - sizeof (struct mp_block ), 0 };
310
321
311
322
/* Atom management */
312
323
static unsigned int atom_table_sz = 4451 ;
@@ -324,6 +335,7 @@ static off_t pack_size;
324
335
/* Table of objects we've written. */
325
336
static unsigned int object_entry_alloc = 5000 ;
326
337
static struct object_entry_pool * blocks ;
338
+ static size_t total_allocd ;
327
339
static struct object_entry * object_table [1 << 16 ];
328
340
static struct mark_set * marks ;
329
341
static const char * export_marks_file ;
@@ -634,7 +646,21 @@ static unsigned int hc_str(const char *s, size_t len)
634
646
return r ;
635
647
}
636
648
637
- static void * pool_alloc (size_t len )
649
+ static struct mp_block * mem_pool_alloc_block (struct mem_pool * mem_pool , size_t block_alloc )
650
+ {
651
+ struct mp_block * p ;
652
+
653
+ mem_pool -> pool_alloc += sizeof (struct mp_block ) + block_alloc ;
654
+ p = xmalloc (st_add (sizeof (struct mp_block ), block_alloc ));
655
+ p -> next_block = mem_pool -> mp_block ;
656
+ p -> next_free = (char * )p -> space ;
657
+ p -> end = p -> next_free + block_alloc ;
658
+ mem_pool -> mp_block = p ;
659
+
660
+ return p ;
661
+ }
662
+
663
+ static void * mem_pool_alloc (struct mem_pool * mem_pool , size_t len )
638
664
{
639
665
struct mp_block * p ;
640
666
void * r ;
@@ -643,40 +669,36 @@ static void *pool_alloc(size_t len)
643
669
if (len & (sizeof (uintmax_t ) - 1 ))
644
670
len += sizeof (uintmax_t ) - (len & (sizeof (uintmax_t ) - 1 ));
645
671
646
- for (p = mp_block_head ; p ; p = p -> next_block )
647
- if (( p -> end - p -> next_free >= len ) )
672
+ for (p = mem_pool -> mp_block ; p ; p = p -> next_block )
673
+ if (p -> end - p -> next_free >= len )
648
674
break ;
649
675
650
676
if (!p ) {
651
- if (len >= (mem_pool_alloc / 2 )) {
652
- total_allocd += len ;
677
+ if (len >= (mem_pool -> block_alloc / 2 )) {
678
+ mem_pool -> pool_alloc += len ;
653
679
return xmalloc (len );
654
680
}
655
- total_allocd += sizeof (struct mp_block ) + mem_pool_alloc ;
656
- p = xmalloc (st_add (sizeof (struct mp_block ), mem_pool_alloc ));
657
- p -> next_block = mp_block_head ;
658
- p -> next_free = (char * ) p -> space ;
659
- p -> end = p -> next_free + mem_pool_alloc ;
660
- mp_block_head = p ;
681
+
682
+ p = mem_pool_alloc_block (mem_pool , mem_pool -> block_alloc );
661
683
}
662
684
663
685
r = p -> next_free ;
664
686
p -> next_free += len ;
665
687
return r ;
666
688
}
667
689
668
- static void * pool_calloc ( size_t count , size_t size )
690
+ static void * mem_pool_calloc ( struct mem_pool * mem_pool , size_t count , size_t size )
669
691
{
670
- size_t len = count * size ;
671
- void * r = pool_alloc ( len );
692
+ size_t len = st_mult ( count , size ) ;
693
+ void * r = mem_pool_alloc ( mem_pool , len );
672
694
memset (r , 0 , len );
673
695
return r ;
674
696
}
675
697
676
698
static char * pool_strdup (const char * s )
677
699
{
678
700
size_t len = strlen (s ) + 1 ;
679
- char * r = pool_alloc ( len );
701
+ char * r = mem_pool_alloc ( & fi_mem_pool , len );
680
702
memcpy (r , s , len );
681
703
return r ;
682
704
}
@@ -685,7 +707,7 @@ static void insert_mark(uintmax_t idnum, struct object_entry *oe)
685
707
{
686
708
struct mark_set * s = marks ;
687
709
while ((idnum >> s -> shift ) >= 1024 ) {
688
- s = pool_calloc ( 1 , sizeof (struct mark_set ));
710
+ s = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
689
711
s -> shift = marks -> shift + 10 ;
690
712
s -> data .sets [0 ] = marks ;
691
713
marks = s ;
@@ -694,7 +716,7 @@ static void insert_mark(uintmax_t idnum, struct object_entry *oe)
694
716
uintmax_t i = idnum >> s -> shift ;
695
717
idnum -= i << s -> shift ;
696
718
if (!s -> data .sets [i ]) {
697
- s -> data .sets [i ] = pool_calloc ( 1 , sizeof (struct mark_set ));
719
+ s -> data .sets [i ] = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
698
720
s -> data .sets [i ]-> shift = s -> shift - 10 ;
699
721
}
700
722
s = s -> data .sets [i ];
@@ -732,7 +754,7 @@ static struct atom_str *to_atom(const char *s, unsigned short len)
732
754
if (c -> str_len == len && !strncmp (s , c -> str_dat , len ))
733
755
return c ;
734
756
735
- c = pool_alloc ( sizeof (struct atom_str ) + len + 1 );
757
+ c = mem_pool_alloc ( & fi_mem_pool , sizeof (struct atom_str ) + len + 1 );
736
758
c -> str_len = len ;
737
759
memcpy (c -> str_dat , s , len );
738
760
c -> str_dat [len ] = 0 ;
@@ -763,7 +785,7 @@ static struct branch *new_branch(const char *name)
763
785
if (check_refname_format (name , REFNAME_ALLOW_ONELEVEL ))
764
786
die ("Branch name doesn't conform to GIT standards: %s" , name );
765
787
766
- b = pool_calloc ( 1 , sizeof (struct branch ));
788
+ b = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct branch ));
767
789
b -> name = pool_strdup (name );
768
790
b -> table_next_branch = branch_table [hc ];
769
791
b -> branch_tree .versions [0 ].mode = S_IFDIR ;
@@ -799,7 +821,7 @@ static struct tree_content *new_tree_content(unsigned int cnt)
799
821
avail_tree_table [hc ] = f -> next_avail ;
800
822
} else {
801
823
cnt = cnt & 7 ? ((cnt / 8 ) + 1 ) * 8 : cnt ;
802
- f = pool_alloc ( sizeof (* t ) + sizeof (t -> entries [0 ]) * cnt );
824
+ f = mem_pool_alloc ( & fi_mem_pool , sizeof (* t ) + sizeof (t -> entries [0 ]) * cnt );
803
825
f -> entry_capacity = cnt ;
804
826
}
805
827
@@ -2862,7 +2884,7 @@ static void parse_new_tag(const char *arg)
2862
2884
enum object_type type ;
2863
2885
const char * v ;
2864
2886
2865
- t = pool_alloc ( sizeof (struct tag ));
2887
+ t = mem_pool_alloc ( & fi_mem_pool , sizeof (struct tag ));
2866
2888
memset (t , 0 , sizeof (struct tag ));
2867
2889
t -> name = pool_strdup (arg );
2868
2890
if (last_tag )
@@ -3461,12 +3483,12 @@ int cmd_main(int argc, const char **argv)
3461
3483
atom_table = xcalloc (atom_table_sz , sizeof (struct atom_str * ));
3462
3484
branch_table = xcalloc (branch_table_sz , sizeof (struct branch * ));
3463
3485
avail_tree_table = xcalloc (avail_tree_table_sz , sizeof (struct avail_tree_content * ));
3464
- marks = pool_calloc ( 1 , sizeof (struct mark_set ));
3486
+ marks = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
3465
3487
3466
3488
global_argc = argc ;
3467
3489
global_argv = argv ;
3468
3490
3469
- rc_free = pool_alloc ( cmd_save * sizeof (* rc_free ));
3491
+ rc_free = mem_pool_alloc ( & fi_mem_pool , cmd_save * sizeof (* rc_free ));
3470
3492
for (i = 0 ; i < (cmd_save - 1 ); i ++ )
3471
3493
rc_free [i ].next = & rc_free [i + 1 ];
3472
3494
rc_free [cmd_save - 1 ].next = NULL ;
@@ -3541,8 +3563,8 @@ int cmd_main(int argc, const char **argv)
3541
3563
fprintf (stderr , "Total branches: %10lu (%10lu loads )\n" , branch_count , branch_load_count );
3542
3564
fprintf (stderr , " marks: %10" PRIuMAX " (%10" PRIuMAX " unique )\n" , (((uintmax_t )1 ) << marks -> shift ) * 1024 , marks_set_count );
3543
3565
fprintf (stderr , " atoms: %10u\n" , atom_cnt );
3544
- fprintf (stderr , "Memory total: %10" PRIuMAX " KiB\n" , (total_allocd + alloc_count * sizeof (struct object_entry ))/1024 );
3545
- fprintf (stderr , " pools: %10lu KiB\n" , (unsigned long )(total_allocd /1024 ));
3566
+ fprintf (stderr , "Memory total: %10" PRIuMAX " KiB\n" , (total_allocd + fi_mem_pool . pool_alloc + alloc_count * sizeof (struct object_entry ))/1024 );
3567
+ fprintf (stderr , " pools: %10lu KiB\n" , (unsigned long )(( total_allocd + fi_mem_pool . pool_alloc ) /1024 ));
3546
3568
fprintf (stderr , " objects: %10" PRIuMAX " KiB\n" , (alloc_count * sizeof (struct object_entry ))/1024 );
3547
3569
fprintf (stderr , "---------------------------------------------------------------------\n" );
3548
3570
pack_report ();
0 commit comments