diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2019-01-03 12:02:06 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-03 12:02:06 +0000 |
commit | fba70a9d5f1fa433968a3dfd51e3153c8eebe834 (patch) | |
tree | 5c18e0bd6d64177e637e4d4c1328ee7008c74a6d | |
parent | 9084712b555a876873bd7d7583f5befd47647c9d (diff) | |
parent | b46c35943a201a6e9be606215327c7da9d4f53c9 (diff) | |
download | libgit2-fba70a9d5f1fa433968a3dfd51e3153c8eebe834.tar.gz |
Merge pull request #4919 from pks-t/pks/shutdown-cb-count
Shutdown callback count
-rw-r--r-- | src/global.c | 36 | ||||
-rw-r--r-- | src/hash.h | 3 | ||||
-rw-r--r-- | src/hash/hash_collisiondetect.h | 6 | ||||
-rw-r--r-- | src/hash/hash_common_crypto.h | 6 | ||||
-rw-r--r-- | src/hash/hash_generic.h | 6 | ||||
-rw-r--r-- | src/hash/hash_mbedtls.h | 6 | ||||
-rw-r--r-- | src/hash/hash_openssl.h | 6 |
7 files changed, 49 insertions, 20 deletions
diff --git a/src/global.c b/src/global.c index 86a35a2ff..418c036c1 100644 --- a/src/global.c +++ b/src/global.c @@ -26,9 +26,23 @@ git_mutex git__mwindow_mutex; -#define MAX_SHUTDOWN_CB 10 +typedef int (*git_global_init_fn)(void); + +static git_global_init_fn git__init_callbacks[] = { + git_allocator_global_init, + git_hash_global_init, + git_sysdir_global_init, + git_filter_global_init, + git_merge_driver_global_init, + git_transport_ssh_global_init, + git_stream_registry_global_init, + git_openssl_stream_global_init, + git_mbedtls_stream_global_init, + git_mwindow_global_init +}; + +static git_global_shutdown_fn git__shutdown_callbacks[ARRAY_SIZE(git__init_callbacks)]; -static git_global_shutdown_fn git__shutdown_callbacks[MAX_SHUTDOWN_CB]; static git_atomic git__n_shutdown_callbacks; static git_atomic git__n_inits; char *git__user_agent; @@ -37,7 +51,7 @@ char *git__ssl_ciphers; void git__on_shutdown(git_global_shutdown_fn callback) { int count = git_atomic_inc(&git__n_shutdown_callbacks); - assert(count <= MAX_SHUTDOWN_CB && count > 0); + assert(count <= (int) ARRAY_SIZE(git__shutdown_callbacks) && count > 0); git__shutdown_callbacks[count - 1] = callback; } @@ -52,6 +66,7 @@ static void git__global_state_cleanup(git_global_st *st) static int init_common(void) { + size_t i; int ret; /* Initialize the CRT debug allocator first, before our first malloc */ @@ -60,17 +75,10 @@ static int init_common(void) git_win32__stack_init(); #endif - /* Initialize any other subsystems that have global state */ - if ((ret = git_allocator_global_init()) == 0 && - (ret = git_hash_global_init()) == 0 && - (ret = git_sysdir_global_init()) == 0 && - (ret = git_filter_global_init()) == 0 && - (ret = git_merge_driver_global_init()) == 0 && - (ret = git_transport_ssh_global_init()) == 0 && - (ret = git_stream_registry_global_init()) == 0 && - (ret = git_openssl_stream_global_init()) == 0 && - (ret = git_mbedtls_stream_global_init()) == 0) - ret = git_mwindow_global_init(); + /* Initialize subsystems that have global state */ + for (i = 0; i < ARRAY_SIZE(git__init_callbacks); i++) + if ((ret = git__init_callbacks[i]()) != 0) + break; GIT_MEMORY_BARRIER; diff --git a/src/hash.h b/src/hash.h index 93765adf3..0502e352e 100644 --- a/src/hash.h +++ b/src/hash.h @@ -14,7 +14,6 @@ typedef struct git_hash_prov git_hash_prov; typedef struct git_hash_ctx git_hash_ctx; -int git_hash_global_init(void); int git_hash_ctx_init(git_hash_ctx *ctx); void git_hash_ctx_cleanup(git_hash_ctx *ctx); @@ -32,6 +31,8 @@ void git_hash_ctx_cleanup(git_hash_ctx *ctx); # include "hash/hash_generic.h" #endif +int git_hash_global_init(void); + typedef struct { void *data; size_t len; diff --git a/src/hash/hash_collisiondetect.h b/src/hash/hash_collisiondetect.h index 4c5e3c302..4e4c7da55 100644 --- a/src/hash/hash_collisiondetect.h +++ b/src/hash/hash_collisiondetect.h @@ -15,10 +15,14 @@ struct git_hash_ctx { SHA1_CTX c; }; -#define git_hash_global_init() 0 #define git_hash_ctx_init(ctx) git_hash_init(ctx) #define git_hash_ctx_cleanup(ctx) +GIT_INLINE(int) git_hash_global_init(void) +{ + return 0; +} + GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx) { assert(ctx); diff --git a/src/hash/hash_common_crypto.h b/src/hash/hash_common_crypto.h index 5c3887dba..ce352a633 100644 --- a/src/hash/hash_common_crypto.h +++ b/src/hash/hash_common_crypto.h @@ -18,10 +18,14 @@ struct git_hash_ctx { #define CC_LONG_MAX ((CC_LONG)-1) -#define git_hash_global_init() 0 #define git_hash_ctx_init(ctx) git_hash_init(ctx) #define git_hash_ctx_cleanup(ctx) +GIT_INLINE(int) git_hash_global_init(void) +{ + return 0; +} + GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx) { assert(ctx); diff --git a/src/hash/hash_generic.h b/src/hash/hash_generic.h index 21a042807..fb0009ccf 100644 --- a/src/hash/hash_generic.h +++ b/src/hash/hash_generic.h @@ -18,8 +18,12 @@ struct git_hash_ctx { unsigned int W[16]; }; -#define git_hash_global_init() 0 #define git_hash_ctx_init(ctx) git_hash_init(ctx) #define git_hash_ctx_cleanup(ctx) +GIT_INLINE(int) git_hash_global_init(void) +{ + return 0; +} + #endif diff --git a/src/hash/hash_mbedtls.h b/src/hash/hash_mbedtls.h index 24196c5bf..7f3decd7d 100644 --- a/src/hash/hash_mbedtls.h +++ b/src/hash/hash_mbedtls.h @@ -14,7 +14,11 @@ struct git_hash_ctx { mbedtls_sha1_context c; }; -#define git_hash_global_init() 0 #define git_hash_ctx_init(ctx) git_hash_init(ctx) +GIT_INLINE(int) git_hash_global_init(void) +{ + return 0; +} + #endif /* INCLUDE_hash_mbedtld_h__ */ diff --git a/src/hash/hash_openssl.h b/src/hash/hash_openssl.h index eb2dcb02f..9a32cba2a 100644 --- a/src/hash/hash_openssl.h +++ b/src/hash/hash_openssl.h @@ -16,10 +16,14 @@ struct git_hash_ctx { SHA_CTX c; }; -#define git_hash_global_init() 0 #define git_hash_ctx_init(ctx) git_hash_init(ctx) #define git_hash_ctx_cleanup(ctx) +GIT_INLINE(int) git_hash_global_init(void) +{ + return 0; +} + GIT_INLINE(int) git_hash_init(git_hash_ctx *ctx) { assert(ctx); |