diff options
Diffstat (limited to 'src/pool.c')
-rw-r--r-- | src/pool.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/pool.c b/src/pool.c index 641292d06..b3cd49665 100644 --- a/src/pool.c +++ b/src/pool.c @@ -10,6 +10,10 @@ struct git_pool_page { char data[GIT_FLEX_ARRAY]; }; +struct pool_freelist { + struct pool_freelist *next; +}; + #define GIT_POOL_MIN_USABLE 4 #define GIT_POOL_MIN_PAGESZ 2 * sizeof(void*) @@ -150,7 +154,7 @@ void *git_pool_malloc(git_pool *pool, uint32_t items) pool->has_multi_item_alloc = 1; else if (pool->free_list != NULL) { ptr = pool->free_list; - pool->free_list = *((void **)pool->free_list); + pool->free_list = ((struct pool_freelist *)pool->free_list)->next; return ptr; } @@ -206,6 +210,11 @@ char *git_pool_strdup(git_pool *pool, const char *str) return git_pool_strndup(pool, str, strlen(str)); } +char *git_pool_strdup_safe(git_pool *pool, const char *str) +{ + return str ? git_pool_strdup(pool, str) : NULL; +} + char *git_pool_strcat(git_pool *pool, const char *a, const char *b) { void *ptr; @@ -230,10 +239,31 @@ char *git_pool_strcat(git_pool *pool, const char *a, const char *b) void git_pool_free(git_pool *pool, void *ptr) { - assert(pool && ptr && pool->item_size >= sizeof(void*)); + struct pool_freelist *item = ptr; + + assert(pool && pool->item_size >= sizeof(void*)); + + if (item) { + item->next = pool->free_list; + pool->free_list = item; + } +} + +void git_pool_free_array(git_pool *pool, size_t count, void **ptrs) +{ + struct pool_freelist **items = (struct pool_freelist **)ptrs; + size_t i; + + assert(pool && ptrs && pool->item_size >= sizeof(void*)); + + if (!count) + return; + + for (i = count - 1; i > 0; --i) + items[i]->next = items[i - 1]; - *((void **)ptr) = pool->free_list; - pool->free_list = ptr; + items[i]->next = pool->free_list; + pool->free_list = items[count - 1]; } uint32_t git_pool__open_pages(git_pool *pool) @@ -275,6 +305,8 @@ uint32_t git_pool__system_page_size(void) SYSTEM_INFO info; GetSystemInfo(&info); size = (uint32_t)info.dwPageSize; +#elif defined(__amigaos4__) + size = (uint32_t)4096; /* 4K as there is no global value we can query */ #else size = (uint32_t)sysconf(_SC_PAGE_SIZE); #endif |