diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2019-02-22 10:06:24 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-22 10:06:24 +0000 |
commit | c5594852ac3344dc162b4e6f9773803a54bccb31 (patch) | |
tree | 3ce338638281a2593975f2d75daceee83b827a3d | |
parent | 3aa8401a8fd8dc919867a33a36c11db7d63cf223 (diff) | |
parent | 765ff6e029a422d910ec65c38fd16ed90caff7b5 (diff) | |
download | libgit2-c5594852ac3344dc162b4e6f9773803a54bccb31.tar.gz |
Merge pull request #4998 from pks-t/pks/allocator-restructuring
Allocator restructuring
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/alloc.c | 16 | ||||
-rw-r--r-- | src/allocators/stdalloc.c (renamed from src/stdalloc.c) | 0 | ||||
-rw-r--r-- | src/allocators/stdalloc.h (renamed from src/stdalloc.h) | 8 | ||||
-rw-r--r-- | src/allocators/win32_crtdbg.c | 118 | ||||
-rw-r--r-- | src/allocators/win32_crtdbg.h | 17 | ||||
-rw-r--r-- | src/win32/w32_crtdbg_stacktrace.c | 93 | ||||
-rw-r--r-- | src/win32/w32_crtdbg_stacktrace.h | 2 |
8 files changed, 142 insertions, 113 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5ad8b1447..b056c9a9b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -428,6 +428,7 @@ ELSE() FILE(GLOB SRC_OS unix/*.c unix/*.h) ENDIF() FILE(GLOB SRC_GIT2 *.c *.h + allocators/*.c allocators/*.h streams/*.c streams/*.h transports/*.c transports/*.h xdiff/*.c xdiff/*.h) diff --git a/src/alloc.c b/src/alloc.c index 8d4a19476..51c4d8029 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -7,11 +7,8 @@ #include "alloc.h" -#if defined(GIT_MSVC_CRTDBG) -# include "win32/w32_crtdbg_stacktrace.h" -#else -# include "stdalloc.h" -#endif +#include "allocators/stdalloc.h" +#include "allocators/win32_crtdbg.h" git_allocator git__allocator; @@ -44,12 +41,3 @@ int git_allocator_setup(git_allocator *allocator) memcpy(&git__allocator, allocator, sizeof(*allocator)); return 0; } - -#if !defined(GIT_MSVC_CRTDBG) -int git_win32_crtdbg_init_allocator(git_allocator *allocator) -{ - GIT_UNUSED(allocator); - git_error_set(GIT_EINVALID, "crtdbg memory allocator not available"); - return -1; -} -#endif diff --git a/src/stdalloc.c b/src/allocators/stdalloc.c index c4938e32b..c4938e32b 100644 --- a/src/stdalloc.c +++ b/src/allocators/stdalloc.c diff --git a/src/stdalloc.h b/src/allocators/stdalloc.h index a8927a507..fa23fe6e3 100644 --- a/src/stdalloc.h +++ b/src/allocators/stdalloc.h @@ -5,13 +5,13 @@ * a Linking Exception. For full terms see the included COPYING file. */ -#ifndef INCLUDE_stdalloc_h__ -#define INCLUDE_stdalloc_h__ - -#include "alloc.h" +#ifndef INCLUDE_allocators_stdalloc_h__ +#define INCLUDE_allocators_stdalloc_h__ #include "common.h" +#include "alloc.h" + int git_stdalloc_init_allocator(git_allocator *allocator); #endif diff --git a/src/allocators/win32_crtdbg.c b/src/allocators/win32_crtdbg.c new file mode 100644 index 000000000..1187e2fcd --- /dev/null +++ b/src/allocators/win32_crtdbg.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) the libgit2 contributors. All rights reserved. + * + * This file is part of libgit2, distributed under the GNU GPL v2 with + * a Linking Exception. For full terms see the included COPYING file. + */ + +#include "win32_crtdbg.h" + +#if defined(GIT_MSVC_CRTDBG) + +#include "win32/w32_crtdbg_stacktrace.h" + +static void *crtdbg__malloc(size_t len, const char *file, int line) +{ + void *ptr = _malloc_dbg(len, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); + if (!ptr) git_error_set_oom(); + return ptr; +} + +static void *crtdbg__calloc(size_t nelem, size_t elsize, const char *file, int line) +{ + void *ptr = _calloc_dbg(nelem, elsize, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); + if (!ptr) git_error_set_oom(); + return ptr; +} + +static char *crtdbg__strdup(const char *str, const char *file, int line) +{ + char *ptr = _strdup_dbg(str, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); + if (!ptr) git_error_set_oom(); + return ptr; +} + +static char *crtdbg__strndup(const char *str, size_t n, const char *file, int line) +{ + size_t length = 0, alloclength; + char *ptr; + + length = p_strnlen(str, n); + + if (GIT_ADD_SIZET_OVERFLOW(&alloclength, length, 1) || + !(ptr = crtdbg__malloc(alloclength, file, line))) + return NULL; + + if (length) + memcpy(ptr, str, length); + + ptr[length] = '\0'; + + return ptr; +} + +static char *crtdbg__substrdup(const char *start, size_t n, const char *file, int line) +{ + char *ptr; + size_t alloclen; + + if (GIT_ADD_SIZET_OVERFLOW(&alloclen, n, 1) || + !(ptr = crtdbg__malloc(alloclen, file, line))) + return NULL; + + memcpy(ptr, start, n); + ptr[n] = '\0'; + return ptr; +} + +static void *crtdbg__realloc(void *ptr, size_t size, const char *file, int line) +{ + void *new_ptr = _realloc_dbg(ptr, size, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); + if (!new_ptr) git_error_set_oom(); + return new_ptr; +} + +static void *crtdbg__reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line) +{ + size_t newsize; + + if (GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize)) + return NULL; + + return crtdbg__realloc(ptr, newsize, file, line); +} + +static void *crtdbg__mallocarray(size_t nelem, size_t elsize, const char *file, int line) +{ + return crtdbg__reallocarray(NULL, nelem, elsize, file, line); +} + +static void crtdbg__free(void *ptr) +{ + free(ptr); +} + +int git_win32_crtdbg_init_allocator(git_allocator *allocator) +{ + allocator->gmalloc = crtdbg__malloc; + allocator->gcalloc = crtdbg__calloc; + allocator->gstrdup = crtdbg__strdup; + allocator->gstrndup = crtdbg__strndup; + allocator->gsubstrdup = crtdbg__substrdup; + allocator->grealloc = crtdbg__realloc; + allocator->greallocarray = crtdbg__reallocarray; + allocator->gmallocarray = crtdbg__mallocarray; + allocator->gfree = crtdbg__free; + return 0; +} + +#else + +int git_win32_crtdbg_init_allocator(git_allocator *allocator) +{ + GIT_UNUSED(allocator); + git_error_set(GIT_EINVALID, "crtdbg memory allocator not available"); + return -1; +} + +#endif diff --git a/src/allocators/win32_crtdbg.h b/src/allocators/win32_crtdbg.h new file mode 100644 index 000000000..754c6b6fb --- /dev/null +++ b/src/allocators/win32_crtdbg.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) the libgit2 contributors. All rights reserved. + * + * This file is part of libgit2, distributed under the GNU GPL v2 with + * a Linking Exception. For full terms see the included COPYING file. + */ + +#ifndef INCLUDE_allocators_crtdbg_h +#define INCLUDE_allocators_crtdbg_h + +#include "common.h" + +#include "alloc.h" + +int git_win32_crtdbg_init_allocator(git_allocator *allocator); + +#endif diff --git a/src/win32/w32_crtdbg_stacktrace.c b/src/win32/w32_crtdbg_stacktrace.c index 49b54f134..cdb5ac1a5 100644 --- a/src/win32/w32_crtdbg_stacktrace.c +++ b/src/win32/w32_crtdbg_stacktrace.c @@ -71,99 +71,6 @@ static bool g_limit_reached = false; /* had allocs after we filled row table */ static unsigned int g_checkpoint_id = 0; /* to better label leak checkpoints */ static bool g_transient_leaks_since_mark = false; /* payload for hook */ -static void *crtdbg__malloc(size_t len, const char *file, int line) -{ - void *ptr = _malloc_dbg(len, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); - if (!ptr) git_error_set_oom(); - return ptr; -} - -static void *crtdbg__calloc(size_t nelem, size_t elsize, const char *file, int line) -{ - void *ptr = _calloc_dbg(nelem, elsize, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); - if (!ptr) git_error_set_oom(); - return ptr; -} - -static char *crtdbg__strdup(const char *str, const char *file, int line) -{ - char *ptr = _strdup_dbg(str, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); - if (!ptr) git_error_set_oom(); - return ptr; -} - -static char *crtdbg__strndup(const char *str, size_t n, const char *file, int line) -{ - size_t length = 0, alloclength; - char *ptr; - - length = p_strnlen(str, n); - - if (GIT_ADD_SIZET_OVERFLOW(&alloclength, length, 1) || - !(ptr = crtdbg__malloc(alloclength, file, line))) - return NULL; - - if (length) - memcpy(ptr, str, length); - - ptr[length] = '\0'; - - return ptr; -} - -static char *crtdbg__substrdup(const char *start, size_t n, const char *file, int line) -{ - char *ptr; - size_t alloclen; - - if (GIT_ADD_SIZET_OVERFLOW(&alloclen, n, 1) || - !(ptr = crtdbg__malloc(alloclen, file, line))) - return NULL; - - memcpy(ptr, start, n); - ptr[n] = '\0'; - return ptr; -} - -static void *crtdbg__realloc(void *ptr, size_t size, const char *file, int line) -{ - void *new_ptr = _realloc_dbg(ptr, size, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); - if (!new_ptr) git_error_set_oom(); - return new_ptr; -} - -static void *crtdbg__reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line) -{ - size_t newsize; - - return GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize) ? - NULL : _realloc_dbg(ptr, newsize, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line); -} - -static void *crtdbg__mallocarray(size_t nelem, size_t elsize, const char *file, int line) -{ - return crtdbg__reallocarray(NULL, nelem, elsize, file, line); -} - -static void crtdbg__free(void *ptr) -{ - free(ptr); -} - -int git_win32_crtdbg_init_allocator(git_allocator *allocator) -{ - allocator->gmalloc = crtdbg__malloc; - allocator->gcalloc = crtdbg__calloc; - allocator->gstrdup = crtdbg__strdup; - allocator->gstrndup = crtdbg__strndup; - allocator->gsubstrdup = crtdbg__substrdup; - allocator->grealloc = crtdbg__realloc; - allocator->greallocarray = crtdbg__reallocarray; - allocator->gmallocarray = crtdbg__mallocarray; - allocator->gfree = crtdbg__free; - return 0; -} - /** * Compare function for bsearch on g_cs_index table. */ diff --git a/src/win32/w32_crtdbg_stacktrace.h b/src/win32/w32_crtdbg_stacktrace.h index 7a3deeff4..d65154bab 100644 --- a/src/win32/w32_crtdbg_stacktrace.h +++ b/src/win32/w32_crtdbg_stacktrace.h @@ -43,8 +43,6 @@ * startup. See tests/main.c for an example. */ -int git_win32_crtdbg_init_allocator(git_allocator *allocator); - /** * Initialize our memory leak tracking and de-dup data structures. * This should ONLY be called by git_libgit2_init(). |