mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
revert 0c390a to stop using tricks with o->refcount
This commit is contained in:
parent
c44d3b56df
commit
a3f3af860b
22
redis.c
22
redis.c
@ -6066,10 +6066,8 @@ static void hashTryConversion(robj *subject, robj **argv, int start, int end) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get the value from a hash identified by key. Returns either a string
|
/* Get the value from a hash identified by key. Returns either a string
|
||||||
* object or NULL if the value cannot be found.
|
* object or NULL if the value cannot be found. The refcount of the object
|
||||||
* Note: the refcount for objects retrieved from a zipmap is set to 0.
|
* is always increased by 1 when the value was found. */
|
||||||
* This is done, so addReply will increment and clean up the object.
|
|
||||||
* Make sure to clean up the object when it isn't added to a reply. */
|
|
||||||
static robj *hashGet(robj *o, robj *key) {
|
static robj *hashGet(robj *o, robj *key) {
|
||||||
robj *value = NULL;
|
robj *value = NULL;
|
||||||
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
|
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
|
||||||
@ -6078,13 +6076,13 @@ static robj *hashGet(robj *o, robj *key) {
|
|||||||
key = getDecodedObject(key);
|
key = getDecodedObject(key);
|
||||||
if (zipmapGet(o->ptr,key->ptr,sdslen(key->ptr),&v,&vlen)) {
|
if (zipmapGet(o->ptr,key->ptr,sdslen(key->ptr),&v,&vlen)) {
|
||||||
value = createStringObject((char*)v,vlen);
|
value = createStringObject((char*)v,vlen);
|
||||||
value->refcount = 0;
|
|
||||||
}
|
}
|
||||||
decrRefCount(key);
|
decrRefCount(key);
|
||||||
} else {
|
} else {
|
||||||
dictEntry *de = dictFind(o->ptr,key);
|
dictEntry *de = dictFind(o->ptr,key);
|
||||||
if (de != NULL) {
|
if (de != NULL) {
|
||||||
value = dictGetEntryVal(de);
|
value = dictGetEntryVal(de);
|
||||||
|
incrRefCount(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
@ -6207,8 +6205,7 @@ static int hashNext(hashIterator *hi) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get key or value object at current iteration position.
|
/* Get key or value object at current iteration position.
|
||||||
* See comments at hashGet for a discussion on the refcount for
|
* This increases the refcount of the field object by 1. */
|
||||||
* keys and values retrieved from zipmaps. */
|
|
||||||
static robj *hashCurrent(hashIterator *hi, int what) {
|
static robj *hashCurrent(hashIterator *hi, int what) {
|
||||||
robj *o;
|
robj *o;
|
||||||
if (hi->encoding == REDIS_ENCODING_ZIPMAP) {
|
if (hi->encoding == REDIS_ENCODING_ZIPMAP) {
|
||||||
@ -6217,13 +6214,13 @@ static robj *hashCurrent(hashIterator *hi, int what) {
|
|||||||
} else {
|
} else {
|
||||||
o = createStringObject((char*)hi->zv,hi->zvlen);
|
o = createStringObject((char*)hi->zv,hi->zvlen);
|
||||||
}
|
}
|
||||||
o->refcount = 0;
|
|
||||||
} else {
|
} else {
|
||||||
if (what & REDIS_HASH_KEY) {
|
if (what & REDIS_HASH_KEY) {
|
||||||
o = dictGetEntryKey(hi->de);
|
o = dictGetEntryKey(hi->de);
|
||||||
} else {
|
} else {
|
||||||
o = dictGetEntryVal(hi->de);
|
o = dictGetEntryVal(hi->de);
|
||||||
}
|
}
|
||||||
|
incrRefCount(o);
|
||||||
}
|
}
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
@ -6299,12 +6296,7 @@ static void hincrbyCommand(redisClient *c) {
|
|||||||
value = (long)current->ptr;
|
value = (long)current->ptr;
|
||||||
else
|
else
|
||||||
redisAssert(1 != 1);
|
redisAssert(1 != 1);
|
||||||
|
|
||||||
/* clean up object when it was retrieved from a zipmap */
|
|
||||||
if (current->refcount == 0) {
|
|
||||||
current->refcount = 1;
|
|
||||||
decrRefCount(current);
|
decrRefCount(current);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
value = 0;
|
value = 0;
|
||||||
}
|
}
|
||||||
@ -6324,6 +6316,7 @@ static void hgetCommand(redisClient *c) {
|
|||||||
|
|
||||||
if ((value = hashGet(o,c->argv[2])) != NULL) {
|
if ((value = hashGet(o,c->argv[2])) != NULL) {
|
||||||
addReplyBulk(c,value);
|
addReplyBulk(c,value);
|
||||||
|
decrRefCount(value);
|
||||||
} else {
|
} else {
|
||||||
addReply(c,shared.nullbulk);
|
addReply(c,shared.nullbulk);
|
||||||
}
|
}
|
||||||
@ -6344,6 +6337,7 @@ static void hmgetCommand(redisClient *c) {
|
|||||||
for (i = 2; i < c->argc; i++) {
|
for (i = 2; i < c->argc; i++) {
|
||||||
if (o != NULL && (value = hashGet(o,c->argv[i])) != NULL) {
|
if (o != NULL && (value = hashGet(o,c->argv[i])) != NULL) {
|
||||||
addReplyBulk(c,value);
|
addReplyBulk(c,value);
|
||||||
|
decrRefCount(value);
|
||||||
} else {
|
} else {
|
||||||
addReply(c,shared.nullbulk);
|
addReply(c,shared.nullbulk);
|
||||||
}
|
}
|
||||||
@ -6389,11 +6383,13 @@ static void genericHgetallCommand(redisClient *c, int flags) {
|
|||||||
if (flags & REDIS_HASH_KEY) {
|
if (flags & REDIS_HASH_KEY) {
|
||||||
obj = hashCurrent(hi,REDIS_HASH_KEY);
|
obj = hashCurrent(hi,REDIS_HASH_KEY);
|
||||||
addReplyBulk(c,obj);
|
addReplyBulk(c,obj);
|
||||||
|
decrRefCount(obj);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (flags & REDIS_HASH_VALUE) {
|
if (flags & REDIS_HASH_VALUE) {
|
||||||
obj = hashCurrent(hi,REDIS_HASH_VALUE);
|
obj = hashCurrent(hi,REDIS_HASH_VALUE);
|
||||||
addReplyBulk(c,obj);
|
addReplyBulk(c,obj);
|
||||||
|
decrRefCount(obj);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user