X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/442246dde2d8842caf4c1f4d4694ef5a78a0bad8..571e257db12eaa6cdd47811f5663ac1003e32b1b:/src/zmalloc.c diff --git a/src/zmalloc.c b/src/zmalloc.c index 89f80d83..97067735 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; }