From 17b41740899ffcf22c150b3ab2d981938bb1a3e2 Mon Sep 17 00:00:00 2001 From: Mark Nunberg Date: Mon, 11 Mar 2019 09:01:32 -0400 Subject: Retain the same semantics for connection error on connection timeout This ensures that a disconnect occurs. This commit also ensures that disconnects will clean the socket even if the user is in no-auto-free mode --- async.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'async.c') diff --git a/async.c b/async.c index 0a2659c..b6163f2 100644 --- a/async.c +++ b/async.c @@ -60,6 +60,7 @@ } while(0) #define _EL_CLEANUP(ctx) do { \ if ((ctx)->ev.cleanup) (ctx)->ev.cleanup((ctx)->ev.data); \ + ctx->ev.cleanup = NULL; \ } while(0); static void refreshTimeout(redisAsyncContext *ctx) { @@ -359,6 +360,10 @@ static void __redisAsyncDisconnect(redisAsyncContext *ac) { c->flags |= REDIS_DISCONNECTING; } + /* cleanup event library on disconnect. + * this is safe to call multiple times */ + _EL_CLEANUP(ac); + /* For non-clean disconnects, __redisAsyncFree() will execute pending * callbacks with a NULL-reply. */ if (!(c->flags & REDIS_NO_AUTO_FREE)) { @@ -697,6 +702,12 @@ void redisAsyncHandleTimeout(redisAsyncContext *ac) { while (__redisShiftCallback(&ac->replies, &cb) == REDIS_OK) { __redisRunCallback(ac, &cb, NULL); } + + /** + * TODO: Don't automatically sever the connection, + * rather, allow to ignore responses before the queue is clear + */ + __redisAsyncDisconnect(ac); } /* Sets a pointer to the first argument and its length starting at p. Returns -- cgit v1.2.3