mem-pool: move reusable parts of memory pool into its own file
This moves the reusable parts of the memory pool logic used by fast-import.c into its own file for use by other components. Signed-off-by: Jameson Miller <jamill@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jameson Miller committed
Apr 11, 2018 at 18:37 UTC
065feab4ebc8e160ab025ff351d724aeda3623ad
4 files changed
+91
-69
Makefile
+1
@@ -833,6 +833,7 @@ LIB_OBJS += log-tree.o
833
LIB_OBJS += mailinfo.o
834
LIB_OBJS += mailmap.o
835
LIB_OBJS += match-trees.o
836
+LIB_OBJS += mem-pool.o
837
LIB_OBJS += merge.o
838
LIB_OBJS += merge-blobs.o
839
LIB_OBJS += merge-recursive.o
fast-import.c
+1
-69
@@ -168,6 +168,7 @@ Format of STDIN stream:
168
#include "dir.h"
169
#include "run-command.h"
170
#include "packfile.h"
171
+#include "mem-pool.h"
172
173
#define PACK_ID_BITS 16
174
#define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
@@ -209,26 +210,6 @@ struct last_object {
210
unsigned no_swap : 1;
211
};
212
212
-struct mp_block {
213
- struct mp_block *next_block;
214
- char *next_free;
215
- char *end;
216
- uintmax_t space[FLEX_ARRAY]; /* more */
217
-};
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
-
213
struct atom_str {
214
struct atom_str *next_atom;
215
unsigned short str_len;
@@ -647,55 +628,6 @@ static unsigned int hc_str(const char *s, size_t len)
628
return r;
629
}
630
650
-static struct mp_block *mem_pool_alloc_block(struct mem_pool *mem_pool, size_t block_alloc)
651
-{
652
- struct mp_block *p;
653
-
654
- mem_pool->pool_alloc += sizeof(struct mp_block) + block_alloc;
655
- p = xmalloc(st_add(sizeof(struct mp_block), block_alloc));
656
- p->next_block = mem_pool->mp_block;
657
- p->next_free = (char *)p->space;
658
- p->end = p->next_free + block_alloc;
659
- mem_pool->mp_block = p;
660
-
661
- return p;
662
-}
663
-
664
-static void *mem_pool_alloc(struct mem_pool *mem_pool, size_t len)
665
-{
666
- struct mp_block *p;
667
- void *r;
668
-
669
- /* round up to a 'uintmax_t' alignment */
670
- if (len & (sizeof(uintmax_t) - 1))
671
- len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
672
-
673
- for (p = mem_pool->mp_block; p; p = p->next_block)
674
- if (p->end - p->next_free >= len)
675
- break;
676
-
677
- if (!p) {
678
- if (len >= (mem_pool->block_alloc / 2)) {
679
- mem_pool->pool_alloc += len;
680
- return xmalloc(len);
681
- }
682
-
683
- p = mem_pool_alloc_block(mem_pool, mem_pool->block_alloc);
684
- }
685
-
686
- r = p->next_free;
687
- p->next_free += len;
688
- return r;
689
-}
690
-
691
-static void *mem_pool_calloc(struct mem_pool *mem_pool, size_t count, size_t size)
692
-{
693
- size_t len = st_mult(count, size);
694
- void *r = mem_pool_alloc(mem_pool, len);
695
- memset(r, 0, len);
696
- return r;
697
-}
698
-
631
static char *pool_strdup(const char *s)
632
{
633
size_t len = strlen(s) + 1;
mem-pool.c
new
+55
@@ -0,0 +1,55 @@
1
+/*
2
+ * Memory Pool implementation logic.
3
+ */
4
+
5
+#include "cache.h"
6
+#include "mem-pool.h"
7
+
8
+static struct mp_block *mem_pool_alloc_block(struct mem_pool *mem_pool, size_t block_alloc)
9
+{
10
+ struct mp_block *p;
11
+
12
+ mem_pool->pool_alloc += sizeof(struct mp_block) + block_alloc;
13
+ p = xmalloc(st_add(sizeof(struct mp_block), block_alloc));
14
+ p->next_block = mem_pool->mp_block;
15
+ p->next_free = (char *)p->space;
16
+ p->end = p->next_free + block_alloc;
17
+ mem_pool->mp_block = p;
18
+
19
+ return p;
20
+}
21
+
22
+void *mem_pool_alloc(struct mem_pool *mem_pool, size_t len)
23
+{
24
+ struct mp_block *p;
25
+ void *r;
26
+
27
+ /* round up to a 'uintmax_t' alignment */
28
+ if (len & (sizeof(uintmax_t) - 1))
29
+ len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
30
+
31
+ for (p = mem_pool->mp_block; p; p = p->next_block)
32
+ if (p->end - p->next_free >= len)
33
+ break;
34
+
35
+ if (!p) {
36
+ if (len >= (mem_pool->block_alloc / 2)) {
37
+ mem_pool->pool_alloc += len;
38
+ return xmalloc(len);
39
+ }
40
+
41
+ p = mem_pool_alloc_block(mem_pool, mem_pool->block_alloc);
42
+ }
43
+
44
+ r = p->next_free;
45
+ p->next_free += len;
46
+ return r;
47
+}
48
+
49
+void *mem_pool_calloc(struct mem_pool *mem_pool, size_t count, size_t size)
50
+{
51
+ size_t len = st_mult(count, size);
52
+ void *r = mem_pool_alloc(mem_pool, len);
53
+ memset(r, 0, len);
54
+ return r;
55
+}
mem-pool.h
new
+34
@@ -0,0 +1,34 @@
1
+#ifndef MEM_POOL_H
2
+#define MEM_POOL_H
3
+
4
+struct mp_block {
5
+ struct mp_block *next_block;
6
+ char *next_free;
7
+ char *end;
8
+ uintmax_t space[FLEX_ARRAY]; /* more */
9
+};
10
+
11
+struct mem_pool {
12
+ struct mp_block *mp_block;
13
+
14
+ /*
15
+ * The amount of available memory to grow the pool by.
16
+ * This size does not include the overhead for the mp_block.
17
+ */
18
+ size_t block_alloc;
19
+
20
+ /* The total amount of memory allocated by the pool. */
21
+ size_t pool_alloc;
22
+};
23
+
24
+/*
25
+ * Alloc memory from the mem_pool.
26
+ */
27
+void *mem_pool_alloc(struct mem_pool *pool, size_t len);
28
+
29
+/*
30
+ * Allocate and zero memory from the memory pool.
31
+ */
32
+void *mem_pool_calloc(struct mem_pool *pool, size_t count, size_t size);
33
+
34
+#endif