async: support for determining monitor mode, if so, repush replies callback in expectation of another reply.

This commit is contained in:
Alex Leverington 2012-07-11 02:53:58 -05:00
parent f8debbfdbe
commit 01cce89d9d
2 changed files with 16 additions and 3 deletions

14
async.c
View File

@ -373,6 +373,11 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
return; return;
} }
/* If monitor mode, repush callback */
if(c->flags & REDIS_MONITORING) {
__redisPushCallback(&ac->replies,&cb);
}
/* When the connection is not being disconnected, simply stop /* When the connection is not being disconnected, simply stop
* trying to get replies and wait for the next loop tick. */ * trying to get replies and wait for the next loop tick. */
break; break;
@ -394,8 +399,9 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
__redisAsyncDisconnect(ac); __redisAsyncDisconnect(ac);
return; return;
} }
/* No more regular callbacks and no errors, the context *must* be subscribed. */ /* No more regular callbacks and no errors, the context *must* be subscribed or monitoring. */
assert(c->flags & REDIS_SUBSCRIBED); assert((c->flags & REDIS_SUBSCRIBED || c->flags & REDIS_MONITORING));
if(c->flags & REDIS_SUBSCRIBED)
__redisGetSubscribeCallback(ac,reply,&cb); __redisGetSubscribeCallback(ac,reply,&cb);
} }
@ -557,6 +563,10 @@ static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void
/* (P)UNSUBSCRIBE does not have its own response: every channel or /* (P)UNSUBSCRIBE does not have its own response: every channel or
* pattern that is unsubscribed will receive a message. This means we * pattern that is unsubscribed will receive a message. This means we
* should not append a callback function for this command. */ * 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 { } else {
if (c->flags & REDIS_SUBSCRIBED) if (c->flags & REDIS_SUBSCRIBED)
/* This will likely result in an error reply, but it needs to be /* This will likely result in an error reply, but it needs to be

View File

@ -76,6 +76,9 @@
/* Flag that is set when the async context has one or more subscriptions. */ /* Flag that is set when the async context has one or more subscriptions. */
#define REDIS_SUBSCRIBED 0x20 #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_STRING 1
#define REDIS_REPLY_ARRAY 2 #define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3 #define REDIS_REPLY_INTEGER 3