diff options
author | Yash Ladha <201551061@iiitvadodara.ac.in> | 2020-11-12 14:25:51 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-12 10:55:51 +0200 |
commit | c170365dcf4698080aeac32e4209ebb2ef7c6c6c (patch) | |
tree | 707a58bd263ab831d9fe16ba044bfc8cf4eeec99 /src/t_list.c | |
parent | a0576bdeea5210e80c070338b245d7548e97a6aa (diff) | |
download | redis-c170365dcf4698080aeac32e4209ebb2ef7c6c6c.tar.gz |
cleanup: move list pop logic to single function (#7997)
BLPOP when there are elements in the list works in the same way as LPOP
does. Due to this they also does the same repetitive action and logic
for the same is written at two different places. This is a bad code
practice as the one needs the context to change the BLPOP list pop code
as well when the LPOP code gets changed.
Separated the generic logic from LPOP to a function that is being used
by the BLPOP code as well.
Diffstat (limited to 'src/t_list.c')
-rw-r--r-- | src/t_list.c | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/src/t_list.c b/src/t_list.c index e7a69b1e9..25dda3178 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -363,26 +363,30 @@ void lsetCommand(client *c) { } } +void listElementsRemoved(client *c, robj *key, int where, robj *o) { + char *event = (where == LIST_HEAD) ? "lpop" : "rpop"; + + notifyKeyspaceEvent(NOTIFY_LIST, event, key, c->db->id); + if (listTypeLength(o) == 0) { + notifyKeyspaceEvent(NOTIFY_GENERIC, "del", key, c->db->id); + dbDelete(c->db, key); + } + signalModifiedKey(c, c->db, key); + server.dirty++; +} + void popGenericCommand(client *c, int where) { - robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.null[c->resp]); - if (o == NULL || checkType(c,o,OBJ_LIST)) return; + robj *o = lookupKeyWriteOrReply(c, c->argv[1], shared.null[c->resp]); + if (o == NULL || checkType(c, o, OBJ_LIST)) + return; - robj *value = listTypePop(o,where); + robj *value = listTypePop(o, where); if (value == NULL) { addReplyNull(c); } else { - char *event = (where == LIST_HEAD) ? "lpop" : "rpop"; - addReplyBulk(c,value); decrRefCount(value); - notifyKeyspaceEvent(NOTIFY_LIST,event,c->argv[1],c->db->id); - if (listTypeLength(o) == 0) { - notifyKeyspaceEvent(NOTIFY_GENERIC,"del", - c->argv[1],c->db->id); - dbDelete(c->db,c->argv[1]); - } - signalModifiedKey(c,c->db,c->argv[1]); - server.dirty++; + listElementsRemoved(c,c->argv[1],where,o); } } @@ -859,7 +863,6 @@ void blockingPopGenericCommand(client *c, int where) { } else { if (listTypeLength(o) != 0) { /* Non empty list, this is like a normal [LR]POP. */ - char *event = (where == LIST_HEAD) ? "lpop" : "rpop"; robj *value = listTypePop(o,where); serverAssert(value != NULL); @@ -867,15 +870,7 @@ void blockingPopGenericCommand(client *c, int where) { addReplyBulk(c,c->argv[j]); addReplyBulk(c,value); decrRefCount(value); - notifyKeyspaceEvent(NOTIFY_LIST,event, - c->argv[j],c->db->id); - if (listTypeLength(o) == 0) { - dbDelete(c->db,c->argv[j]); - notifyKeyspaceEvent(NOTIFY_GENERIC,"del", - c->argv[j],c->db->id); - } - signalModifiedKey(c,c->db,c->argv[j]); - server.dirty++; + listElementsRemoved(c,c->argv[j],where,o); /* Replicate it as an [LR]POP instead of B[LR]POP. */ rewriteClientCommandVector(c,2, |