X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/48082cc044202878364edce68a1323a96d2d40b4..7b81e5a16ca577b7aa10dd0398cce4ba9cdf0842:/src/t_list.c diff --git a/src/t_list.c b/src/t_list.c index 0690fd2f..21fd1c2f 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -198,7 +198,7 @@ void listTypeInsert(listTypeEntry *entry, robj *value, int where) { int listTypeEqual(listTypeEntry *entry, robj *o) { listTypeIterator *li = entry->li; if (li->encoding == REDIS_ENCODING_ZIPLIST) { - redisAssert(o->encoding == REDIS_ENCODING_RAW); + redisAssertWithInfo(NULL,o,o->encoding == REDIS_ENCODING_RAW); return ziplistCompare(entry->zi,o->ptr,sdslen(o->ptr)); } else if (li->encoding == REDIS_ENCODING_LINKEDLIST) { return equalStringObjects(o,listNodeValue(entry->ln)); @@ -235,7 +235,7 @@ void listTypeDelete(listTypeEntry *entry) { void listTypeConvert(robj *subject, int enc) { listTypeIterator *li; listTypeEntry entry; - redisAssert(subject->type == REDIS_LIST); + redisAssertWithInfo(NULL,subject,subject->type == REDIS_LIST); if (enc == REDIS_ENCODING_LINKEDLIST) { list *l = listCreate(); @@ -310,7 +310,7 @@ void pushxGenericCommand(redisClient *c, robj *refval, robj *val, int where) { if (refval != NULL) { /* Note: we expect refval to be string-encoded because it is *not* the * last argument of the multi-bulk LINSERT. */ - redisAssert(refval->encoding == REDIS_ENCODING_RAW); + redisAssertWithInfo(c,refval,refval->encoding == REDIS_ENCODING_RAW); /* We're not sure if this value can be inserted yet, but we cannot * convert the list inside the iterator. We don't want to loop over @@ -519,7 +519,12 @@ void lrangeCommand(redisClient *c) { p = ziplistNext(o->ptr,p); } } else if (o->encoding == REDIS_ENCODING_LINKEDLIST) { - listNode *ln = listIndex(o->ptr,start); + listNode *ln; + + /* If we are nearest to the end of the list, reach the element + * starting from tail and going backward, as it is faster. */ + if (start > llen/2) start -= llen; + ln = listIndex(o->ptr,start); while(rangelen--) { addReplyBulk(c,ln->value); @@ -769,9 +774,9 @@ void blockForKeys(redisClient *c, robj **keys, int numkeys, time_t timeout, robj l = listCreate(); retval = dictAdd(c->db->blocking_keys,keys[j],l); incrRefCount(keys[j]); - redisAssert(retval == DICT_OK); + redisAssertWithInfo(c,keys[j],retval == DICT_OK); } else { - l = dictGetEntryVal(de); + l = dictGetVal(de); } listAddNodeTail(l,c); } @@ -786,13 +791,13 @@ void unblockClientWaitingData(redisClient *c) { list *l; int j; - redisAssert(c->bpop.keys != NULL); + redisAssertWithInfo(c,NULL,c->bpop.keys != NULL); /* The client may wait for multiple keys, so unblock it for every key. */ for (j = 0; j < c->bpop.count; j++) { /* Remove this client from the list of clients waiting for this key. */ de = dictFind(c->db->blocking_keys,c->bpop.keys[j]); - redisAssert(de != NULL); - l = dictGetEntryVal(de); + redisAssertWithInfo(c,c->bpop.keys[j],de != NULL); + l = dictGetVal(de); listDelNode(l,listSearchKey(l,c)); /* If the list is empty we need to remove it to avoid wasting memory */ if (listLength(l) == 0) @@ -831,7 +836,7 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) { de = dictFind(c->db->blocking_keys,key); if (de == NULL) return 0; - clients = dictGetEntryVal(de); + clients = dictGetVal(de); numclients = listLength(clients); /* Try to handle the push as long as there are clients waiting for a push. @@ -843,7 +848,7 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) { * this happens, it simply tries the next client waiting for a push. */ while (numclients--) { ln = listFirst(clients); - redisAssert(ln != NULL); + redisAssertWithInfo(c,key,ln != NULL); receiver = ln->value; dstkey = receiver->bpop.target; @@ -990,7 +995,7 @@ void brpoplpushCommand(redisClient *c) { /* The list exists and has elements, so * the regular rpoplpushCommand is executed. */ - redisAssert(listTypeLength(key) > 0); + redisAssertWithInfo(c,key,listTypeLength(key) > 0); rpoplpushCommand(c); } }