use gcc sync builtins for memory counter when possible
This commit is contained in:
parent
491dce4064
commit
e7e0375bd2
@ -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 @@
|
|||||||
#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 @@
|
|||||||
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) {
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user