提交 4ad37480 编写于 作者: A antirez

thread safe zmalloc used memory counter

上级 b04a5df9
...@@ -6999,6 +6999,9 @@ static void vmInit(void) { ...@@ -6999,6 +6999,9 @@ static void vmInit(void) {
int pipefds[2]; int pipefds[2];
size_t stacksize; size_t stacksize;
if (server.vm_max_threads != 0)
zmalloc_enable_thread_safeness(); /* we need thread safe zmalloc() */
server.vm_fp = fopen("/tmp/redisvm","w+b"); server.vm_fp = fopen("/tmp/redisvm","w+b");
if (server.vm_fp == NULL) { if (server.vm_fp == NULL) {
redisLog(REDIS_WARNING,"Impossible to open the swap file. Exiting."); redisLog(REDIS_WARNING,"Impossible to open the swap file. Exiting.");
......
...@@ -40,7 +40,28 @@ ...@@ -40,7 +40,28 @@
#define PREFIX_SIZE sizeof(size_t) #define PREFIX_SIZE sizeof(size_t)
#endif #endif
#define increment_used_memory(_n) do { \
if (zmalloc_thread_safe) { \
pthread_mutex_lock(&used_memory_mutex); \
used_memory += _n; \
pthread_mutex_unlock(&used_memory_mutex); \
} else { \
used_memory += _n; \
} \
} while(0)
#define decrement_used_memory(_n) do { \
if (zmalloc_thread_safe) { \
pthread_mutex_lock(&used_memory_mutex); \
used_memory -= _n; \
pthread_mutex_unlock(&used_memory_mutex); \
} else { \
used_memory -= _n; \
} \
} while(0)
static size_t used_memory = 0; static size_t used_memory = 0;
static int zmalloc_thread_safe = 0;
pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t used_memory_mutex = PTHREAD_MUTEX_INITIALIZER;
static void zmalloc_oom(size_t size) { static void zmalloc_oom(size_t size) {
...@@ -55,11 +76,11 @@ void *zmalloc(size_t size) { ...@@ -55,11 +76,11 @@ void *zmalloc(size_t size) {
if (!ptr) zmalloc_oom(size); if (!ptr) zmalloc_oom(size);
#ifdef HAVE_MALLOC_SIZE #ifdef HAVE_MALLOC_SIZE
used_memory += redis_malloc_size(ptr); increment_used_memory(redis_malloc_size(ptr));
return ptr; return ptr;
#else #else
*((size_t*)ptr) = size; *((size_t*)ptr) = size;
used_memory += size+PREFIX_SIZE; increment_used_memory(size+PREFIX_SIZE);
return (char*)ptr+PREFIX_SIZE; return (char*)ptr+PREFIX_SIZE;
#endif #endif
} }
...@@ -77,8 +98,8 @@ void *zrealloc(void *ptr, size_t size) { ...@@ -77,8 +98,8 @@ void *zrealloc(void *ptr, size_t size) {
newptr = realloc(ptr,size); newptr = realloc(ptr,size);
if (!newptr) zmalloc_oom(size); if (!newptr) zmalloc_oom(size);
used_memory -= oldsize; decrement_used_memory(oldsize);
used_memory += redis_malloc_size(newptr); increment_used_memory(redis_malloc_size(newptr));
return newptr; return newptr;
#else #else
realptr = (char*)ptr-PREFIX_SIZE; realptr = (char*)ptr-PREFIX_SIZE;
...@@ -87,8 +108,8 @@ void *zrealloc(void *ptr, size_t size) { ...@@ -87,8 +108,8 @@ void *zrealloc(void *ptr, size_t size) {
if (!newptr) zmalloc_oom(size); if (!newptr) zmalloc_oom(size);
*((size_t*)newptr) = size; *((size_t*)newptr) = size;
used_memory -= oldsize; decrement_used_memory(oldsize);
used_memory += size; increment_used_memory(size);
return (char*)newptr+PREFIX_SIZE; return (char*)newptr+PREFIX_SIZE;
#endif #endif
} }
...@@ -101,12 +122,12 @@ void zfree(void *ptr) { ...@@ -101,12 +122,12 @@ void zfree(void *ptr) {
if (ptr == NULL) return; if (ptr == NULL) return;
#ifdef HAVE_MALLOC_SIZE #ifdef HAVE_MALLOC_SIZE
used_memory -= redis_malloc_size(ptr); decrement_used_memory(redis_malloc_size(ptr));
free(ptr); free(ptr);
#else #else
realptr = (char*)ptr-PREFIX_SIZE; realptr = (char*)ptr-PREFIX_SIZE;
oldsize = *((size_t*)realptr); oldsize = *((size_t*)realptr);
used_memory -= oldsize+PREFIX_SIZE; decrement_used_memory(oldsize+PREFIX_SIZE);
free(realptr); free(realptr);
#endif #endif
} }
...@@ -120,5 +141,14 @@ char *zstrdup(const char *s) { ...@@ -120,5 +141,14 @@ char *zstrdup(const char *s) {
} }
size_t zmalloc_used_memory(void) { size_t zmalloc_used_memory(void) {
return used_memory; 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);
return um;
}
void zmalloc_enable_thread_safeness(void) {
zmalloc_thread_safe = 1;
} }
...@@ -36,5 +36,6 @@ void *zrealloc(void *ptr, size_t size); ...@@ -36,5 +36,6 @@ void *zrealloc(void *ptr, size_t size);
void zfree(void *ptr); void zfree(void *ptr);
char *zstrdup(const char *s); char *zstrdup(const char *s);
size_t zmalloc_used_memory(void); size_t zmalloc_used_memory(void);
void zmalloc_enable_thread_safeness(void);
#endif /* _ZMALLOC_H */ #endif /* _ZMALLOC_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册