提交 b08c36c5 编写于 作者: A antirez

Lazyfree: keep count of objects to free.

上级 c7b46a47
......@@ -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().");
}
......
#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);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册