@@ -168,6 +168,7 @@ Format of STDIN stream:
168
168
#include "dir.h"
169
169
#include "run-command.h"
170
170
#include "packfile.h"
171
+ #include "mem-pool.h"
171
172
172
173
#define PACK_ID_BITS 16
173
174
#define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
@@ -209,13 +210,6 @@ struct last_object {
209
210
unsigned no_swap : 1 ;
210
211
};
211
212
212
- struct mem_pool {
213
- struct mem_pool * next_pool ;
214
- char * next_free ;
215
- char * end ;
216
- uintmax_t space [FLEX_ARRAY ]; /* more */
217
- };
218
-
219
213
struct atom_str {
220
214
struct atom_str * next_atom ;
221
215
unsigned short str_len ;
@@ -304,9 +298,7 @@ static int global_argc;
304
298
static const char * * global_argv ;
305
299
306
300
/* Memory pools */
307
- static size_t mem_pool_alloc = 2 * 1024 * 1024 - sizeof (struct mem_pool );
308
- static size_t total_allocd ;
309
- static struct mem_pool * mem_pool ;
301
+ static struct mem_pool fi_mem_pool = {0 , 2 * 1024 * 1024 - sizeof (struct mp_block ), 0 };
310
302
311
303
/* Atom management */
312
304
static unsigned int atom_table_sz = 4451 ;
@@ -324,6 +316,7 @@ static off_t pack_size;
324
316
/* Table of objects we've written. */
325
317
static unsigned int object_entry_alloc = 5000 ;
326
318
static struct object_entry_pool * blocks ;
319
+ static size_t total_allocd ;
327
320
static struct object_entry * object_table [1 << 16 ];
328
321
static struct mark_set * marks ;
329
322
static const char * export_marks_file ;
@@ -634,49 +627,10 @@ static unsigned int hc_str(const char *s, size_t len)
634
627
return r ;
635
628
}
636
629
637
- static void * pool_alloc (size_t len )
638
- {
639
- struct mem_pool * p ;
640
- void * r ;
641
-
642
- /* round up to a 'uintmax_t' alignment */
643
- if (len & (sizeof (uintmax_t ) - 1 ))
644
- len += sizeof (uintmax_t ) - (len & (sizeof (uintmax_t ) - 1 ));
645
-
646
- for (p = mem_pool ; p ; p = p -> next_pool )
647
- if ((p -> end - p -> next_free >= len ))
648
- break ;
649
-
650
- if (!p ) {
651
- if (len >= (mem_pool_alloc /2 )) {
652
- total_allocd += len ;
653
- return xmalloc (len );
654
- }
655
- total_allocd += sizeof (struct mem_pool ) + mem_pool_alloc ;
656
- p = xmalloc (st_add (sizeof (struct mem_pool ), mem_pool_alloc ));
657
- p -> next_pool = mem_pool ;
658
- p -> next_free = (char * ) p -> space ;
659
- p -> end = p -> next_free + mem_pool_alloc ;
660
- mem_pool = p ;
661
- }
662
-
663
- r = p -> next_free ;
664
- p -> next_free += len ;
665
- return r ;
666
- }
667
-
668
- static void * pool_calloc (size_t count , size_t size )
669
- {
670
- size_t len = count * size ;
671
- void * r = pool_alloc (len );
672
- memset (r , 0 , len );
673
- return r ;
674
- }
675
-
676
630
static char * pool_strdup (const char * s )
677
631
{
678
632
size_t len = strlen (s ) + 1 ;
679
- char * r = pool_alloc ( len );
633
+ char * r = mem_pool_alloc ( & fi_mem_pool , len );
680
634
memcpy (r , s , len );
681
635
return r ;
682
636
}
@@ -685,7 +639,7 @@ static void insert_mark(uintmax_t idnum, struct object_entry *oe)
685
639
{
686
640
struct mark_set * s = marks ;
687
641
while ((idnum >> s -> shift ) >= 1024 ) {
688
- s = pool_calloc ( 1 , sizeof (struct mark_set ));
642
+ s = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
689
643
s -> shift = marks -> shift + 10 ;
690
644
s -> data .sets [0 ] = marks ;
691
645
marks = s ;
@@ -694,7 +648,7 @@ static void insert_mark(uintmax_t idnum, struct object_entry *oe)
694
648
uintmax_t i = idnum >> s -> shift ;
695
649
idnum -= i << s -> shift ;
696
650
if (!s -> data .sets [i ]) {
697
- s -> data .sets [i ] = pool_calloc ( 1 , sizeof (struct mark_set ));
651
+ s -> data .sets [i ] = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
698
652
s -> data .sets [i ]-> shift = s -> shift - 10 ;
699
653
}
700
654
s = s -> data .sets [i ];
@@ -732,7 +686,7 @@ static struct atom_str *to_atom(const char *s, unsigned short len)
732
686
if (c -> str_len == len && !strncmp (s , c -> str_dat , len ))
733
687
return c ;
734
688
735
- c = pool_alloc ( sizeof (struct atom_str ) + len + 1 );
689
+ c = mem_pool_alloc ( & fi_mem_pool , sizeof (struct atom_str ) + len + 1 );
736
690
c -> str_len = len ;
737
691
memcpy (c -> str_dat , s , len );
738
692
c -> str_dat [len ] = 0 ;
@@ -763,7 +717,7 @@ static struct branch *new_branch(const char *name)
763
717
if (check_refname_format (name , REFNAME_ALLOW_ONELEVEL ))
764
718
die ("Branch name doesn't conform to GIT standards: %s" , name );
765
719
766
- b = pool_calloc ( 1 , sizeof (struct branch ));
720
+ b = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct branch ));
767
721
b -> name = pool_strdup (name );
768
722
b -> table_next_branch = branch_table [hc ];
769
723
b -> branch_tree .versions [0 ].mode = S_IFDIR ;
@@ -799,7 +753,7 @@ static struct tree_content *new_tree_content(unsigned int cnt)
799
753
avail_tree_table [hc ] = f -> next_avail ;
800
754
} else {
801
755
cnt = cnt & 7 ? ((cnt / 8 ) + 1 ) * 8 : cnt ;
802
- f = pool_alloc ( sizeof (* t ) + sizeof (t -> entries [0 ]) * cnt );
756
+ f = mem_pool_alloc ( & fi_mem_pool , sizeof (* t ) + sizeof (t -> entries [0 ]) * cnt );
803
757
f -> entry_capacity = cnt ;
804
758
}
805
759
@@ -2863,7 +2817,7 @@ static void parse_new_tag(const char *arg)
2863
2817
enum object_type type ;
2864
2818
const char * v ;
2865
2819
2866
- t = pool_alloc ( sizeof (struct tag ));
2820
+ t = mem_pool_alloc ( & fi_mem_pool , sizeof (struct tag ));
2867
2821
memset (t , 0 , sizeof (struct tag ));
2868
2822
t -> name = pool_strdup (arg );
2869
2823
if (last_tag )
@@ -3462,12 +3416,12 @@ int cmd_main(int argc, const char **argv)
3462
3416
atom_table = xcalloc (atom_table_sz , sizeof (struct atom_str * ));
3463
3417
branch_table = xcalloc (branch_table_sz , sizeof (struct branch * ));
3464
3418
avail_tree_table = xcalloc (avail_tree_table_sz , sizeof (struct avail_tree_content * ));
3465
- marks = pool_calloc ( 1 , sizeof (struct mark_set ));
3419
+ marks = mem_pool_calloc ( & fi_mem_pool , 1 , sizeof (struct mark_set ));
3466
3420
3467
3421
global_argc = argc ;
3468
3422
global_argv = argv ;
3469
3423
3470
- rc_free = pool_alloc ( cmd_save * sizeof (* rc_free ));
3424
+ rc_free = mem_pool_alloc ( & fi_mem_pool , cmd_save * sizeof (* rc_free ));
3471
3425
for (i = 0 ; i < (cmd_save - 1 ); i ++ )
3472
3426
rc_free [i ].next = & rc_free [i + 1 ];
3473
3427
rc_free [cmd_save - 1 ].next = NULL ;
@@ -3542,8 +3496,8 @@ int cmd_main(int argc, const char **argv)
3542
3496
fprintf (stderr , "Total branches: %10lu (%10lu loads )\n" , branch_count , branch_load_count );
3543
3497
fprintf (stderr , " marks: %10" PRIuMAX " (%10" PRIuMAX " unique )\n" , (((uintmax_t )1 ) << marks -> shift ) * 1024 , marks_set_count );
3544
3498
fprintf (stderr , " atoms: %10u\n" , atom_cnt );
3545
- fprintf (stderr , "Memory total: %10" PRIuMAX " KiB\n" , (total_allocd + alloc_count * sizeof (struct object_entry ))/1024 );
3546
- fprintf (stderr , " pools: %10lu KiB\n" , (unsigned long )(total_allocd /1024 ));
3499
+ fprintf (stderr , "Memory total: %10" PRIuMAX " KiB\n" , (total_allocd + fi_mem_pool . pool_alloc + alloc_count * sizeof (struct object_entry ))/1024 );
3500
+ fprintf (stderr , " pools: %10lu KiB\n" , (unsigned long )(( total_allocd + fi_mem_pool . pool_alloc ) /1024 ));
3547
3501
fprintf (stderr , " objects: %10" PRIuMAX " KiB\n" , (alloc_count * sizeof (struct object_entry ))/1024 );
3548
3502
fprintf (stderr , "---------------------------------------------------------------------\n" );
3549
3503
pack_report ();
0 commit comments