From a35ddf129c477ecced24220d0e3eb3f5c84163dd Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 5 Jan 2010 07:19:09 -0500 Subject: [PATCH] more object-level VM primitives --- redis.c | 23 +++++++++++++++-------- redis.conf | 4 ++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/redis.c b/redis.c index e6b4455e9..8d1b91d3d 100644 --- a/redis.c +++ b/redis.c @@ -487,6 +487,7 @@ static void queueMultiCommand(redisClient *c, struct redisCommand *cmd); static void unblockClient(redisClient *c); static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele); static void vmInit(void); +static void vmMarkPagesFree(off_t page, off_t count); static void authCommand(redisClient *c); static void pingCommand(redisClient *c); @@ -836,6 +837,7 @@ static void dictRedisObjectDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); + if (val == NULL) return; /* Values of swapped out keys as set to NULL */ decrRefCount(val); } @@ -2320,20 +2322,25 @@ static void freeHashObject(robj *o) { } static void incrRefCount(robj *o) { + assert(!server.vm_enabled || o->storage == REDIS_VM_MEMORY); o->refcount++; -#ifdef DEBUG_REFCOUNT - if (o->type == REDIS_STRING) - printf("Increment '%s'(%p), now is: %d\n",o->ptr,o,o->refcount); -#endif } static void decrRefCount(void *obj) { robj *o = obj; -#ifdef DEBUG_REFCOUNT - if (o->type == REDIS_STRING) - printf("Decrement '%s'(%p), now is: %d\n",o->ptr,o,o->refcount-1); -#endif + /* REDIS_VM_SWAPPED */ + if (server.vm_enabled && o->storage == REDIS_VM_SWAPPED) { + assert(o->refcount == 1); + assert(o->type == REDIS_STRING); + freeStringObject(o); + vmMarkPagesFree(o->vm.page,o->vm.usedpages); + if (listLength(server.objfreelist) > REDIS_OBJFREELIST_MAX || + !listAddNodeHead(server.objfreelist,o)) + zfree(o); + return; + } + /* REDIS_VM_MEMORY */ if (--(o->refcount) == 0) { switch(o->type) { case REDIS_STRING: freeStringObject(o); break; diff --git a/redis.conf b/redis.conf index c1a1f7f12..5c8ef93d9 100644 --- a/redis.conf +++ b/redis.conf @@ -164,6 +164,10 @@ appendfsync always # appendfsync everysec # appendfsync no +################################ VIRTUAL MEMORY ############################### + +vm-enabled yes + ############################### ADVANCED CONFIG ############################### # Glue small output buffers together in order to send small replies in a -- GitLab