summaryrefslogtreecommitdiff
path: root/async.c
diff options
context:
space:
mode:
authorMark Nunberg <mnunberg@haskalah.org>2019-03-11 09:01:32 -0400
committerMark Nunberg <mnunberg@haskalah.org>2019-03-11 09:20:21 -0400
commit17b41740899ffcf22c150b3ab2d981938bb1a3e2 (patch)
treee6f71683b87687c3968a8a9dcecaa8e0ca9da56b /async.c
parent297de989a647a6f96f25aabea267aa0d18c43328 (diff)
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
Diffstat (limited to 'async.c')
-rw-r--r--async.c11
1 files changed, 11 insertions, 0 deletions
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 <x> responses before the queue is clear
+ */
+ __redisAsyncDisconnect(ac);
}
/* Sets a pointer to the first argument and its length starting at p. Returns