]> git.saurik.com Git - redis.git/commitdiff
Skiplist theoretical fix
authorantirez <antirez@gmail.com>
Thu, 8 Apr 2010 13:56:21 +0000 (15:56 +0200)
committerantirez <antirez@gmail.com>
Thu, 8 Apr 2010 13:56:21 +0000 (15:56 +0200)
redis.c
redis.tcl

diff --git a/redis.c b/redis.c
index 2a65f36f98a93cac29df63032be3b775dfac4cf7..00dc6ccca0e6984e24833cfb3d2a7989f9cae154 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -5092,7 +5092,7 @@ static int zslRandomLevel(void) {
     int level = 1;
     while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))
         level += 1;
-    return level;
+    return (level<ZSKIPLIST_MAXLEVEL) ? level : (ZSKIPLIST_MAXLEVEL-1);
 }
 
 static void zslInsert(zskiplist *zsl, double score, robj *obj) {
index 8965021debaa91fedbf05c7febdd9460e0d8b975..a1f3f566a199a28241dc71f79c21471f53c6d431 100644 (file)
--- a/redis.tcl
+++ b/redis.tcl
@@ -33,6 +33,7 @@ array set ::redis::fd {}
 array set ::redis::blocking {}
 array set ::redis::callback {}
 array set ::redis::state {} ;# State in non-blocking reply reading
+array set ::redis::statestack {} ;# Stack of states, for nested mbulks
 array set ::redis::bulkarg {}
 array set ::redis::multibulkarg {}
 
@@ -117,6 +118,7 @@ proc ::redis::__method__close {id fd} {
     catch {unset ::redis::fd($id)}
     catch {unset ::redis::blocking($id)}
     catch {unset ::redis::state($id)}
+    catch {unset ::redis::statestack($id)}
     catch {unset ::redis::callback($id)}
     catch {interp alias {} ::redis::redisHandle$id {}}
 }
@@ -176,6 +178,7 @@ proc ::redis::redis_read_reply fd {
 
 proc ::redis::redis_reset_state id {
     set ::redis::state($id) [dict create buf {} mbulk -1 bulk -1 reply {}]
+    set ::redis::statestack($id) {}
 }
 
 proc ::redis::redis_call_callback {id type reply} {
@@ -209,7 +212,13 @@ proc ::redis::redis_readable {fd id} {
                     ::redis::redis_readable $fd $id
                 }
             }
-            * {dict set ::redis::state($id) mbulk [string range $line 1 end-1]}
+            * {
+                dict set ::redis::state($id) mbulk [string range $line 1 end-1]
+                # Handle *-1
+                if {[dict get $::redis::state($id) mbulk] == -1} {
+                    redis_call_callback $id reply {}
+                }
+            }
             default {
                 redis_call_callback $id err \
                     "Bad protocol, $type as reply type byte"