Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
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