Commit 03c0938f by lhchavez

Avoid using atomics in pool.c

Instead, globally initialize the system page size.
parent cc1d7f5c
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "sysdir.h" #include "sysdir.h"
#include "filter.h" #include "filter.h"
#include "merge_driver.h" #include "merge_driver.h"
#include "pool.h"
#include "streams/registry.h" #include "streams/registry.h"
#include "streams/mbedtls.h" #include "streams/mbedtls.h"
#include "streams/openssl.h" #include "streams/openssl.h"
...@@ -38,7 +39,8 @@ static git_global_init_fn git__init_callbacks[] = { ...@@ -38,7 +39,8 @@ static git_global_init_fn git__init_callbacks[] = {
git_stream_registry_global_init, git_stream_registry_global_init,
git_openssl_stream_global_init, git_openssl_stream_global_init,
git_mbedtls_stream_global_init, git_mbedtls_stream_global_init,
git_mwindow_global_init git_mwindow_global_init,
git_pool_global_init
}; };
static git_global_shutdown_fn git__shutdown_callbacks[ARRAY_SIZE(git__init_callbacks)]; static git_global_shutdown_fn git__shutdown_callbacks[ARRAY_SIZE(git__init_callbacks)];
......
...@@ -21,23 +21,19 @@ struct git_pool_page { ...@@ -21,23 +21,19 @@ struct git_pool_page {
static void *pool_alloc_page(git_pool *pool, size_t size); static void *pool_alloc_page(git_pool *pool, size_t size);
static size_t pool_system_page_size(void) #ifndef GIT_DEBUG_POOL
{
static git_atomic_ssize cached_size = {0};
size_t page_size = 0;
if ((page_size = (size_t)git_atomic_ssize_get(&cached_size)) == 0) { static size_t system_page_size = 0;
if (git__page_size(&page_size) < 0)
page_size = 4096;
/* allow space for malloc overhead */
page_size -= (2 * sizeof(void *)) + sizeof(git_pool_page);
git_atomic_ssize_set(&cached_size, (int64_t)page_size);
}
return page_size; int git_pool_global_init(void)
{
if (git__page_size(&system_page_size) < 0)
system_page_size = 4096;
/* allow space for malloc overhead */
system_page_size -= (2 * sizeof(void *)) + sizeof(git_pool_page);
return 0;
} }
#ifndef GIT_DEBUG_POOL
int git_pool_init(git_pool *pool, size_t item_size) int git_pool_init(git_pool *pool, size_t item_size)
{ {
assert(pool); assert(pool);
...@@ -45,7 +41,7 @@ int git_pool_init(git_pool *pool, size_t item_size) ...@@ -45,7 +41,7 @@ int git_pool_init(git_pool *pool, size_t item_size)
memset(pool, 0, sizeof(git_pool)); memset(pool, 0, sizeof(git_pool));
pool->item_size = item_size; pool->item_size = item_size;
pool->page_size = pool_system_page_size(); pool->page_size = system_page_size;
return 0; return 0;
} }
...@@ -115,6 +111,11 @@ bool git_pool__ptr_in_pool(git_pool *pool, void *ptr) ...@@ -115,6 +111,11 @@ bool git_pool__ptr_in_pool(git_pool *pool, void *ptr)
#else #else
int git_pool_global_init(void)
{
return 0;
}
static int git_pool__ptr_cmp(const void * a, const void * b) static int git_pool__ptr_cmp(const void * a, const void * b)
{ {
if(a > b) { if(a > b) {
......
...@@ -135,4 +135,12 @@ extern uint32_t git_pool__open_pages(git_pool *pool); ...@@ -135,4 +135,12 @@ extern uint32_t git_pool__open_pages(git_pool *pool);
#endif #endif
extern bool git_pool__ptr_in_pool(git_pool *pool, void *ptr); extern bool git_pool__ptr_in_pool(git_pool *pool, void *ptr);
/**
* This function is being called by our global setup routines to
* initialize the system pool size.
*
* @return 0 on success, <0 on failure
*/
extern int git_pool_global_init(void);
#endif #endif
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
# if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)) # if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1))
# error Atomic primitives do not exist on this version of gcc; configure libgit2 with -DTHREADSAFE=OFF # error Atomic primitives do not exist on this version of gcc; configure libgit2 with -DTHREADSAFE=OFF
# endif # elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
# define GIT_BUILTIN_ATOMIC # define GIT_BUILTIN_ATOMIC
# else # else
# define GIT_BUILTIN_SYNC # define GIT_BUILTIN_SYNC
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment