summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Leverington <nessence@gmail.com>2012-07-11 02:53:58 -0500
committerAlex Leverington <nessence@gmail.com>2012-07-11 02:53:58 -0500
commit01cce89d9d6d6d91c464fa8d755899a7d5322c86 (patch)
tree4bab4ec31ed33cb0e2a312a9a7e40c1f9a82edbe
parentf8debbfdbebb97f5d0ee2218edf1425ac219cff5 (diff)
async: support for determining monitor mode, if so, repush replies callback in expectation of another reply.
-rw-r--r--async.c16
-rw-r--r--hiredis.h3
2 files changed, 16 insertions, 3 deletions
diff --git a/async.c b/async.c
index f83e2f5..12551ce 100644
--- a/async.c
+++ b/async.c
@@ -372,6 +372,11 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
__redisAsyncDisconnect(ac);
return;
}
+
+ /* If monitor mode, repush callback */
+ if(c->flags & REDIS_MONITORING) {
+ __redisPushCallback(&ac->replies,&cb);
+ }
/* When the connection is not being disconnected, simply stop
* trying to get replies and wait for the next loop tick. */
@@ -394,9 +399,10 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
__redisAsyncDisconnect(ac);
return;
}
- /* No more regular callbacks and no errors, the context *must* be subscribed. */
- assert(c->flags & REDIS_SUBSCRIBED);
- __redisGetSubscribeCallback(ac,reply,&cb);
+ /* No more regular callbacks and no errors, the context *must* be subscribed or monitoring. */
+ assert((c->flags & REDIS_SUBSCRIBED || c->flags & REDIS_MONITORING));
+ if(c->flags & REDIS_SUBSCRIBED)
+ __redisGetSubscribeCallback(ac,reply,&cb);
}
if (cb.fn != NULL) {
@@ -557,6 +563,10 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void
/* (P)UNSUBSCRIBE does not have its own response: every channel or
* pattern that is unsubscribed will receive a message. This means we
* should not append a callback function for this command. */
+ } else if(strncasecmp(cstr,"monitor\r\n",9) == 0) {
+ /* Set monitor flag and push callback */
+ c->flags |= REDIS_MONITORING;
+ __redisPushCallback(&ac->replies,&cb);
} else {
if (c->flags & REDIS_SUBSCRIBED)
/* This will likely result in an error reply, but it needs to be
diff --git a/hiredis.h b/hiredis.h
index 8358375..7c04b62 100644
--- a/hiredis.h
+++ b/hiredis.h
@@ -76,6 +76,9 @@
/* Flag that is set when the async context has one or more subscriptions. */
#define REDIS_SUBSCRIBED 0x20
+/* Flag that is set when monitor mode is active */
+#define REDIS_MONITORING 0x40
+
#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3