summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichel Martens & Damian Janowski <michel+djanowski@soveran.com>2010-11-29 23:47:45 -0300
committerMichel Martens <michel@soveran.com>2010-11-29 23:52:07 -0300
commitbaa14ef913032baf34645faeae80f5cd6895f97a (patch)
tree2a79b2ed3e1599315b1d03cc31e6ecd3690dd3ca /src
parent8987bf23bfd7b4d8501db98f4ae7e37310f58fbd (diff)
downloadredis-baa14ef913032baf34645faeae80f5cd6895f97a.tar.gz
Fix BRPOPLPUSH behavior for all use cases.
Diffstat (limited to 'src')
-rw-r--r--src/t_list.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/t_list.c b/src/t_list.c
index 0da70a040..ceed70c31 100644
--- a/src/t_list.c
+++ b/src/t_list.c
@@ -748,10 +748,6 @@ void unblockClientWaitingData(redisClient *c) {
decrRefCount(c->bpop.keys[j]);
}
- if (c->bpop.target != NULL) {
- decrRefCount(c->bpop.target);
- }
-
/* Cleanup the client structure */
zfree(c->bpop.keys);
c->bpop.keys = NULL;
@@ -789,7 +785,11 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
redisAssert(ln != NULL);
receiver = ln->value;
- if (receiver->bpop.target == NULL) {
+ robj *target = receiver->bpop.target;
+
+ unblockClientWaitingData(receiver);
+
+ if (target == NULL) {
/* BRPOP/BLPOP return a multi-bulk with the name
* of the popped list */
addReplyMultiBulkLen(receiver,2);
@@ -797,23 +797,23 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
addReplyBulk(receiver,ele);
} else {
/* BRPOPLPUSH */
- robj *dobj = lookupKeyWrite(receiver->db,receiver->bpop.target);
+ robj *dobj = lookupKeyWrite(receiver->db,target);
if (dobj && checkType(receiver,dobj,REDIS_LIST)) return 0;
addReplyBulk(receiver,ele);
- if (!handleClientsWaitingListPush(receiver, receiver->bpop.target, ele)) {
+ if (!handleClientsWaitingListPush(receiver, target, ele)) {
/* Create the list if the key does not exist */
if (!dobj) {
dobj = createZiplistObject();
- dbAdd(receiver->db, receiver->bpop.target, dobj);
+ dbAdd(receiver->db, target, dobj);
}
-
listTypePush(dobj, ele, REDIS_HEAD);
}
+
+ decrRefCount(target);
}
- unblockClientWaitingData(receiver);
return 1;
}