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
Hide 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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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);
decrRefCount(current);
/* clean up object when it was retrieved from a zipmap */
if (current->refcount == 0) {
current->refcount = 1;
decrRefCount(current);
}
} else {
} else {
value = 0;
value = 0;
}
}
...
@@ -6324,6 +6316,7 @@ static void hgetCommand(redisClient *c) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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++;
}
}
}
}
...
...
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