]> git.saurik.com Git - redis.git/commitdiff
use gcc sync builtins for memory counter when possible
authorPremysl Hruby <dfenze@gmail.com>
Sun, 26 Feb 2012 08:59:32 +0000 (09:59 +0100)
committerantirez <antirez@gmail.com>
Sun, 26 Feb 2012 10:45:52 +0000 (11:45 +0100)
src/config.h
src/zmalloc.c

index 323a3ddd1f43b00678aae3a4e87c93b0edc9a117..2bf0f93403198876226d92f9ed5f3a982c215b75 100644 (file)
 #error "Undefined or invalid BYTE_ORDER"
 #endif
 
+#if (__i386 || __amd64) && __GNUC__
+    #include <features.h>
+
+    #if __GNUC_PREREQ(4,1)
+        #define HAVE_ATOMIC
+    #endif
+#endif
+
+
 #endif
index 89f80d8336073b77e873a1946bfb2d2cf5d22e67..970677355f26656742b8ffc1c3071ec6a5c3e264 100644 (file)
 #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;
 }