Commit 80ff1fc6 authored by Premysl Hruby's avatar Premysl Hruby Committed by antirez
Browse files

use gcc sync builtins for memory counter when possible

parent 59132e42
...@@ -96,4 +96,13 @@ ...@@ -96,4 +96,13 @@
#error "Undefined or invalid BYTE_ORDER" #error "Undefined or invalid BYTE_ORDER"
#endif #endif
#if (__i386 || __amd64) && __GNUC__
#include <features.h>
#if __GNUC_PREREQ(4,1)
#define HAVE_ATOMIC
#endif
#endif
#endif #endif
...@@ -58,13 +58,29 @@ ...@@ -58,13 +58,29 @@
#define free(ptr) je_free(ptr) #define free(ptr) je_free(ptr)
#endif #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 { \ #define update_zmalloc_stat_alloc(__n,__size) do { \
size_t _n = (__n); \ size_t _n = (__n); \
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
if (zmalloc_thread_safe) { \ if (zmalloc_thread_safe) { \
pthread_mutex_lock(&used_memory_mutex); \ update_zmalloc_stat_add(_n); \
used_memory += _n; \
pthread_mutex_unlock(&used_memory_mutex); \
} else { \ } else { \
used_memory += _n; \ used_memory += _n; \
} \ } \
...@@ -74,9 +90,7 @@ ...@@ -74,9 +90,7 @@
size_t _n = (__n); \ size_t _n = (__n); \
if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \ if (_n&(sizeof(long)-1)) _n += sizeof(long)-(_n&(sizeof(long)-1)); \
if (zmalloc_thread_safe) { \ if (zmalloc_thread_safe) { \
pthread_mutex_lock(&used_memory_mutex); \ update_zmalloc_stat_sub(_n); \
used_memory -= _n; \
pthread_mutex_unlock(&used_memory_mutex); \
} else { \ } else { \
used_memory -= _n; \ used_memory -= _n; \
} \ } \
...@@ -193,9 +207,19 @@ char *zstrdup(const char *s) { ...@@ -193,9 +207,19 @@ char *zstrdup(const char *s) {
size_t zmalloc_used_memory(void) { size_t zmalloc_used_memory(void) {
size_t um; size_t um;
if (zmalloc_thread_safe) pthread_mutex_lock(&used_memory_mutex); if (zmalloc_thread_safe) {
um = used_memory; #ifdef HAVE_ATOMIC
if (zmalloc_thread_safe) pthread_mutex_unlock(&used_memory_mutex); 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; return um;
} }
......
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