]> git.saurik.com Git - redis.git/commitdiff
more object-level VM primitives
authorantirez <antirez@gmail.com>
Tue, 5 Jan 2010 12:19:09 +0000 (07:19 -0500)
committerantirez <antirez@gmail.com>
Tue, 5 Jan 2010 12:19:09 +0000 (07:19 -0500)
redis.c
redis.conf

diff --git a/redis.c b/redis.c
index e6b4455e963dab404ab611f29f5dcd91c4598bc4..8d1b91d3d4a5cf67350ce86e6ed26630d3936cdf 100644 (file)
--- 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;
index c1a1f7f12de8512591b69b0fb1f1a4dd3aa849cb..5c8ef93d96e8824dbacd9682885f8c453eb296b4 100644 (file)
@@ -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