From 80ff1fc6d0e3da53ae7bea0354216a38f7303971 Mon Sep 17 00:00:00 2001 From: Premysl Hruby Date: Sun, 26 Feb 2012 09:59:32 +0100 Subject: [PATCH] use gcc sync builtins for memory counter when possible --- src/config.h | 9 +++++++++ src/zmalloc.c | 42 +++++++++++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/config.h b/src/config.h index 323a3ddd1..2bf0f9340 100644 --- a/src/config.h +++ b/src/config.h @@ -96,4 +96,13 @@ #error "Undefined or invalid BYTE_ORDER" #endif +#if (__i386 || __amd64) && __GNUC__ + #include + + #if __GNUC_PREREQ(4,1) + #define HAVE_ATOMIC + #endif +#endif + + #endif diff --git a/src/zmalloc.c b/src/zmalloc.c index 89f80d833..970677355 100644 --- a/src/zmalloc.c +++ b/src/zmalloc.c @@ -58,13 +58,29 @@ #define free(ptr) je_free(ptr) #endif +#ifdef HAVE_ATOMIC +#define update_zmalloc_stat_add(__n) __sync_add_and_fetch(&used_memory, (__n)) +#define update_zmalloc_stat_sub(__n) __sync_sub_and_fetch(&used_memory, (__n)) +#else +#define update_zmalloc_stat_add(__n) do { \ + pthread_mutex_lock(&used_memory_mutex); \ + used_memory += (__n); \ + pthread_mutex_unlock(&used_memory_mutex); \ +} while(0) + +#define update_zmalloc_stat_sub(__n) do { \ + pthread_mutex_lock(&used_memory_mutex); \ + used_memory -= (__n); \ + pthread_mutex_unlock(&used_memory_mutex); \ +} while(0) + +#endif + #define update_zmalloc_stat_alloc(__n,__size) do { \ size_t _n = (__n); \ if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (zmalloc_thread_safe) { \ - pthread_mutex_lock(&used_memory_mutex); \ - used_memory += _n; \ - pthread_mutex_unlock(&used_memory_mutex); \ + update_zmalloc_stat_add(_n); \ } else { \ used_memory += _n; \ } \ @@ -74,9 +90,7 @@ size_t _n = (__n); \ if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (zmalloc_thread_safe) { \ - pthread_mutex_lock(&used_memory_mutex); \ - used_memory -= _n; \ - pthread_mutex_unlock(&used_memory_mutex); \ + update_zmalloc_stat_sub(_n); \ } else { \ used_memory -= _n; \ } \ @@ -193,9 +207,19 @@ char *zstrdup(const char *s) { size_t zmalloc_used_memory(void) { size_t um; - if (zmalloc_thread_safe) pthread_mutex_lock(&used_memory_mutex); - um = used_memory; - if (zmalloc_thread_safe) pthread_mutex_unlock(&used_memory_mutex); + if (zmalloc_thread_safe) { +#ifdef HAVE_ATOMIC + um = __sync_add_and_fetch(&used_memory, 0); +#else + pthread_mutex_lock(&used_memory_mutex); + um = used_memory; + pthread_mutex_unlock(&used_memory_mutex); +#endif + } + else { + um = used_memory; + } + return um; } -- GitLab