X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/16d778780eb865deefb2bfa024aef50926917eac..f797c7dc176c833e6aa412c557d7fedd59dc1124:/src/object.c diff --git a/src/object.c b/src/object.c index 4374a07c..e6b02da8 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; } @@ -32,6 +31,7 @@ robj *createStringObject(char *ptr, size_t len) { robj *createStringObjectFromLongLong(long long value) { robj *o; if (value >= 0 && value < REDIS_SHARED_INTEGERS && + !server.ds_enabled && pthread_equal(pthread_self(),server.mainthread)) { incrRefCount(shared.integers[value]); o = shared.integers[value]; @@ -162,9 +162,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; @@ -208,16 +205,16 @@ robj *tryObjectEncoding(robj *o) { /* Ok, this object can be encoded... * * Can I use a shared object? Only if the object is inside a given - * range and if this is the main thread, since when VM is enabled we - * have the constraint that I/O thread should only handle non-shared - * objects, in order to avoid race conditions (we don't have per-object - * locking). + * range and if the back end in use is in-memory. For disk store every + * object in memory used as value should be independent. * * Note that we also avoid using shared integers when maxmemory is used - * because very object needs to have a private LRU field for the LRU + * because every object needs to have a private LRU field for the LRU * algorithm to work well. */ - if (server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS && - pthread_equal(pthread_self(),server.mainthread)) { + if (!server.ds_enabled && + server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS && + pthread_equal(pthread_self(),server.mainthread)) + { decrRefCount(o); incrRefCount(shared.integers[value]); return shared.integers[value];