]> git.saurik.com Git - redis.git/commitdiff
Update src/redis-benchmark.c
authorNanXiao <xn212516@163.com>
Wed, 10 Oct 2012 09:08:43 +0000 (17:08 +0800)
committerantirez <antirez@gmail.com>
Thu, 18 Oct 2012 09:05:47 +0000 (11:05 +0200)
The code of current implementation:

if (c->pending == 0) clientDone(c);
In clientDone function, the c's memory has been freed, then the loop will continue: while(c->pending). The memory of c has been freed now, so c->pending is invalid (c is an invalid pointer now), and this will cause memory dump in some platforams(eg: Solaris).

So I think the code should be modified as:
if (c->pending == 0)
{
clientDone(c);
break;
}
and this will not lead to while(c->pending).

src/redis-benchmark.c

index 1be4c07d913dcee9937b90c2f1457e6d32d8f966..d95bfd8ea817f1452aac8a731bcd332fe9ceb813 100644 (file)
@@ -201,7 +201,10 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
                 if (config.requests_finished < config.requests)
                     config.latency[config.requests_finished++] = c->latency;
                 c->pending--;
-                if (c->pending == 0) clientDone(c);
+                if (c->pending == 0) {
+                    clientDone(c);
+                    break;
+                }
             } else {
                 break;
             }