Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a3f3af86
Commit
a3f3af86
authored
Apr 16, 2010
by
Pieter Noordhuis
Browse files
revert 0c390a to stop using tricks with o->refcount
parent
c44d3b56
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
a3f3af86
...
...
@@ -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
* object or NULL if the value cannot be found.
* Note: the refcount for objects retrieved from a zipmap is set to 0.
* 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. */
* object or NULL if the value cannot be found. The refcount of the object
* is always increased by 1 when the value was found. */
static robj *hashGet(robj *o, robj *key) {
robj *value = NULL;
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
...
...
@@ -6078,13 +6076,13 @@ static robj *hashGet(robj *o, robj *key) {
key = getDecodedObject(key);
if (zipmapGet(o->ptr,key->ptr,sdslen(key->ptr),&v,&vlen)) {
value = createStringObject((char*)v,vlen);
value
->
refcount
=
0
;
}
decrRefCount(key);
} else {
dictEntry *de = dictFind(o->ptr,key);
if (de != NULL) {
value = dictGetEntryVal(de);
incrRefCount(value);
}
}
return value;
...
...
@@ -6207,8 +6205,7 @@ static int hashNext(hashIterator *hi) {
}
/* Get key or value object at current iteration position.
* See comments at hashGet for a discussion on the refcount for
* keys and values retrieved from zipmaps. */
* This increases the refcount of the field object by 1. */
static robj *hashCurrent(hashIterator *hi, int what) {
robj *o;
if (hi->encoding == REDIS_ENCODING_ZIPMAP) {
...
...
@@ -6217,13 +6214,13 @@ static robj *hashCurrent(hashIterator *hi, int what) {
} else {
o = createStringObject((char*)hi->zv,hi->zvlen);
}
o
->
refcount
=
0
;
} else {
if (what & REDIS_HASH_KEY) {
o = dictGetEntryKey(hi->de);
} else {
o = dictGetEntryVal(hi->de);
}
incrRefCount(o);
}
return o;
}
...
...
@@ -6299,12 +6296,7 @@ static void hincrbyCommand(redisClient *c) {
value = (long)current->ptr;
else
redisAssert(1 != 1);
/* clean up object when it was retrieved from a zipmap */
if
(
current
->
refcount
==
0
)
{
current
->
refcount
=
1
;
decrRefCount(current);
}
} else {
value = 0;
}
...
...
@@ -6324,6 +6316,7 @@ static void hgetCommand(redisClient *c) {
if ((value = hashGet(o,c->argv[2])) != NULL) {
addReplyBulk(c,value);
decrRefCount(value);
} else {
addReply(c,shared.nullbulk);
}
...
...
@@ -6344,6 +6337,7 @@ static void hmgetCommand(redisClient *c) {
for (i = 2; i < c->argc; i++) {
if (o != NULL && (value = hashGet(o,c->argv[i])) != NULL) {
addReplyBulk(c,value);
decrRefCount(value);
} else {
addReply(c,shared.nullbulk);
}
...
...
@@ -6389,11 +6383,13 @@ static void genericHgetallCommand(redisClient *c, int flags) {
if (flags & REDIS_HASH_KEY) {
obj = hashCurrent(hi,REDIS_HASH_KEY);
addReplyBulk(c,obj);
decrRefCount(obj);
count++;
}
if (flags & REDIS_HASH_VALUE) {
obj = hashCurrent(hi,REDIS_HASH_VALUE);
addReplyBulk(c,obj);
decrRefCount(obj);
count++;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment