X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/98a9abb66d2471e9ea4e657566fbd61a7f28b02b..e12b27acf72ee7e40a6a39ffc7c109914c584cd9:/src/object.c diff --git a/src/object.c b/src/object.c index a132665e..c384d600 100644 --- a/src/object.c +++ b/src/object.c @@ -21,7 +21,6 @@ robj *createObject(int type, void *ptr) { /* The following is only needed if VM is active, but since the conditional * is probably more costly than initializing the field it's better to * have every field properly initialized anyway. */ - o->storage = REDIS_DS_MEMORY; return o; } @@ -94,12 +93,18 @@ robj *createHashObject(void) { robj *createZsetObject(void) { zset *zs = zmalloc(sizeof(*zs)); - zs->dict = dictCreate(&zsetDictType,NULL); zs->zsl = zslCreate(); return createObject(REDIS_ZSET,zs); } +robj *createZsetZiplistObject(void) { + unsigned char *zl = ziplistNew(); + robj *o = createObject(REDIS_ZSET,zl); + o->encoding = REDIS_ENCODING_ZIPLIST; + return o; +} + void freeStringObject(robj *o) { if (o->encoding == REDIS_ENCODING_RAW) { sdsfree(o->ptr); @@ -133,11 +138,20 @@ void freeSetObject(robj *o) { } void freeZsetObject(robj *o) { - zset *zs = o->ptr; - - dictRelease(zs->dict); - zslFree(zs->zsl); - zfree(zs); + zset *zs; + switch (o->encoding) { + case REDIS_ENCODING_RAW: + zs = o->ptr; + dictRelease(zs->dict); + zslFree(zs->zsl); + zfree(zs); + break; + case REDIS_ENCODING_ZIPLIST: + zfree(o->ptr); + break; + default: + redisPanic("Unknown sorted set encoding"); + } } void freeHashObject(robj *o) { @@ -163,9 +177,6 @@ void decrRefCount(void *obj) { if (o->refcount <= 0) redisPanic("decrRefCount against refcount <= 0"); if (--(o->refcount) == 0) { - /* DS_SAVING objects should always have a reference in the - * IO Job structure. So we should never reach this state. */ - redisAssert(o->storage != REDIS_DS_SAVING); switch(o->type) { case REDIS_STRING: freeStringObject(o); break; case REDIS_LIST: freeListObject(o); break;