From b08c36c5f2e635a128f2a306b6f38a0159ed56e6 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 25 Sep 2015 16:22:25 +0200 Subject: [PATCH] Lazyfree: keep count of objects to free. --- src/bio.c | 3 ++- src/lazyfree.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/bio.c b/src/bio.c index d0f74a29..fa10a503 100644 --- a/src/bio.c +++ b/src/bio.c @@ -84,6 +84,7 @@ struct bio_job { }; void *bioProcessBackgroundJobs(void *arg); +void lazyfreeFreeObjectFromBioThread(robj *o); /* Make sure we have enough stack to perform all the things we do in the * main thread. */ @@ -186,7 +187,7 @@ void *bioProcessBackgroundJobs(void *arg) { } else if (type == BIO_AOF_FSYNC) { aof_fsync((long)job->arg1); } else if (type == BIO_LAZY_FREE) { - decrRefCount((robj*)job->arg1); + lazyfreeFreeObjectFromBioThread(job->arg1); } else { serverPanic("Wrong job type in bioProcessBackgroundJobs()."); } diff --git a/src/lazyfree.c b/src/lazyfree.c index aae11d8a..f94edfd0 100644 --- a/src/lazyfree.c +++ b/src/lazyfree.c @@ -1,10 +1,9 @@ #include "server.h" #include "bio.h" +#include "atomicvar.h" static size_t lazyfree_objects = 0; -static size_t lazyfree_dbs = 0; pthread_mutex_t lazyfree_objects_mutex = PTHREAD_MUTEX_INITIALIZER; -pthread_mutex_t lazyfree_objects_dbs = PTHREAD_MUTEX_INITIALIZER; /* Return the amount of work needed in order to free an object. * The return value is not always the actual number of allocations the @@ -60,6 +59,7 @@ int dbAsyncDelete(redisDb *db, robj *key) { /* If releasing the object is too much work, let's put it into the * lazy free list. */ if (free_effort > LAZYFREE_THRESHOLD) { + atomicIncr(lazyfree_objects,1,&lazyfree_objects_mutex); bioCreateBackgroundJob(BIO_LAZY_FREE,val,NULL,NULL); dictSetVal(db->dict,de,NULL); } @@ -74,3 +74,10 @@ int dbAsyncDelete(redisDb *db, robj *key) { return 0; } } + +/* Implementation of function to release a single object called from the + * lazyfree thread from bio.c. */ +void lazyfreeFreeObjectFromBioThread(robj *o) { + decrRefCount(o); + atomicDecr(lazyfree_objects,1,&lazyfree_objects_mutex); +}