diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2020-12-09 14:03:42 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-09 14:03:42 +0000 |
commit | b661e9aa59c32e8cee02903c410eb93e5b1e615a (patch) | |
tree | eef5cf32487f23de17be31abfe944ee7b6c0fbfe | |
parent | a5cb2cc9f547d9defaf51b2af25ba2fa9d9015a0 (diff) | |
parent | 08f28ff50e3f6fabcc1469fdf4a53c3a3a33eff4 (diff) | |
download | libgit2-b661e9aa59c32e8cee02903c410eb93e5b1e615a.tar.gz |
Merge pull request #5578 from libgit2/ethomson/friendlier_getting_started
Friendlier getting started in the lack of git_libgit2_init
-rw-r--r-- | src/alloc.c | 20 | ||||
-rw-r--r-- | src/allocators/failalloc.c | 92 | ||||
-rw-r--r-- | src/allocators/failalloc.h | 23 | ||||
-rw-r--r-- | src/errors.c | 10 | ||||
-rw-r--r-- | src/libgit2.c | 5 | ||||
-rw-r--r-- | src/libgit2.h | 2 | ||||
-rw-r--r-- | src/runtime.c | 15 | ||||
-rw-r--r-- | src/runtime.h | 9 |
8 files changed, 172 insertions, 4 deletions
diff --git a/src/alloc.c b/src/alloc.c index 6efa104ca..2820d84a2 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -8,10 +8,22 @@ #include "alloc.h" #include "runtime.h" +#include "allocators/failalloc.h" #include "allocators/stdalloc.h" #include "allocators/win32_leakcheck.h" -git_allocator git__allocator; +/* Fail any allocation until git_libgit2_init is called. */ +git_allocator git__allocator = { + git_failalloc_malloc, + git_failalloc_calloc, + git_failalloc_strdup, + git_failalloc_strndup, + git_failalloc_substrdup, + git_failalloc_realloc, + git_failalloc_reallocarray, + git_failalloc_mallocarray, + git_failalloc_free +}; static int setup_default_allocator(void) { @@ -25,10 +37,10 @@ static int setup_default_allocator(void) int git_allocator_global_init(void) { /* - * We don't want to overwrite any allocator which has been set before - * the init function is called. + * We don't want to overwrite any allocator which has been set + * before the init function is called. */ - if (git__allocator.gmalloc != NULL) + if (git__allocator.gmalloc != git_failalloc_malloc) return 0; return setup_default_allocator(); diff --git a/src/allocators/failalloc.c b/src/allocators/failalloc.c new file mode 100644 index 000000000..5257d1dec --- /dev/null +++ b/src/allocators/failalloc.c @@ -0,0 +1,92 @@ +/* + * 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 "failalloc.h" + +void *git_failalloc_malloc(size_t len, const char *file, int line) +{ + GIT_UNUSED(len); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +void *git_failalloc_calloc(size_t nelem, size_t elsize, const char *file, int line) +{ + GIT_UNUSED(nelem); + GIT_UNUSED(elsize); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +char *git_failalloc_strdup(const char *str, const char *file, int line) +{ + GIT_UNUSED(str); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +char *git_failalloc_strndup(const char *str, size_t n, const char *file, int line) +{ + GIT_UNUSED(str); + GIT_UNUSED(n); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +char *git_failalloc_substrdup(const char *start, size_t n, const char *file, int line) +{ + GIT_UNUSED(start); + GIT_UNUSED(n); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +void *git_failalloc_realloc(void *ptr, size_t size, const char *file, int line) +{ + GIT_UNUSED(ptr); + GIT_UNUSED(size); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +void *git_failalloc_reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line) +{ + GIT_UNUSED(ptr); + GIT_UNUSED(nelem); + GIT_UNUSED(elsize); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +void *git_failalloc_mallocarray(size_t nelem, size_t elsize, const char *file, int line) +{ + GIT_UNUSED(nelem); + GIT_UNUSED(elsize); + GIT_UNUSED(file); + GIT_UNUSED(line); + + return NULL; +} + +void git_failalloc_free(void *ptr) +{ + GIT_UNUSED(ptr); +} diff --git a/src/allocators/failalloc.h b/src/allocators/failalloc.h new file mode 100644 index 000000000..6115e51e7 --- /dev/null +++ b/src/allocators/failalloc.h @@ -0,0 +1,23 @@ +/* + * 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_failalloc_h__ +#define INCLUDE_allocators_failalloc_h__ + +#include "common.h" + +extern void *git_failalloc_malloc(size_t len, const char *file, int line); +extern void *git_failalloc_calloc(size_t nelem, size_t elsize, const char *file, int line); +extern char *git_failalloc_strdup(const char *str, const char *file, int line); +extern char *git_failalloc_strndup(const char *str, size_t n, const char *file, int line); +extern char *git_failalloc_substrdup(const char *start, size_t n, const char *file, int line); +extern void *git_failalloc_realloc(void *ptr, size_t size, const char *file, int line); +extern void *git_failalloc_reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line); +extern void *git_failalloc_mallocarray(size_t nelem, size_t elsize, const char *file, int line); +extern void git_failalloc_free(void *ptr); + +#endif diff --git a/src/errors.c b/src/errors.c index 5b68dd9cb..3d1d1c9a1 100644 --- a/src/errors.c +++ b/src/errors.c @@ -10,6 +10,7 @@ #include "threadstate.h" #include "posix.h" #include "buffer.h" +#include "libgit2.h" /******************************************** * New error handling @@ -20,6 +21,11 @@ static git_error g_git_oom_error = { GIT_ERROR_NOMEMORY }; +static git_error g_git_uninitialized_error = { + "libgit2 has not been initialized; you must call git_libgit2_init", + GIT_ERROR_INVALID +}; + static void set_error_from_buffer(int error_class) { git_error *error = &GIT_THREADSTATE->error_t; @@ -131,6 +137,10 @@ void git_error_clear(void) const git_error *git_error_last(void) { + /* If the library is not initialized, return a static error. */ + if (!git_libgit2_init_count()) + return &g_git_uninitialized_error; + return GIT_THREADSTATE->last_error; } diff --git a/src/libgit2.c b/src/libgit2.c index e41988c8e..f27c9997d 100644 --- a/src/libgit2.c +++ b/src/libgit2.c @@ -90,6 +90,11 @@ int git_libgit2_init(void) return git_runtime_init(init_fns, ARRAY_SIZE(init_fns)); } +int git_libgit2_init_count(void) +{ + return git_runtime_init_count(); +} + int git_libgit2_shutdown(void) { return git_runtime_shutdown(); diff --git a/src/libgit2.h b/src/libgit2.h index 6f92a8318..a898367ae 100644 --- a/src/libgit2.h +++ b/src/libgit2.h @@ -7,6 +7,8 @@ #ifndef INCLUDE_libgit2_h__ #define INCLUDE_libgit2_h__ +extern int git_libgit2_init_count(void); + extern const char *git_libgit2__user_agent(void); extern const char *git_libgit2__ssl_ciphers(void); diff --git a/src/runtime.c b/src/runtime.c index b61c3c4ba..c05dee8b9 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -127,6 +127,21 @@ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt) return ret; } +int git_runtime_init_count(void) +{ + int ret; + + if (init_lock() < 0) + return -1; + + ret = git_atomic32_get(&init_count); + + if (init_unlock() < 0) + return -1; + + return ret; +} + int git_runtime_shutdown(void) { int ret; diff --git a/src/runtime.h b/src/runtime.h index be2e37a60..2cbcafe52 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -28,6 +28,15 @@ typedef void (*git_runtime_shutdown_fn)(void); */ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt); +/* + * Returns the number of initializations active (the number of calls to + * `git_runtime_init` minus the number of calls sto `git_runtime_shutdown`). + * If 0, the runtime is not currently initialized. + * + * @return The number of initializations performed or an error + */ +int git_runtime_init_count(void); + /** * Shut down the runtime. If this is the last shutdown call, * such that there are no remaining `init` calls, then any |