Make error ptr accessible from async context

This commit is contained in:
Pieter Noordhuis 2010-11-01 09:52:17 +01:00
parent 4e3bd7893d
commit 437eea80fc
2 changed files with 14 additions and 1 deletions

12
async.c
View File

@ -40,9 +40,18 @@ static redisAsyncContext *redisAsyncInitialize(redisContext *c) {
return ac;
}
/* We want the error field to be accessible directly instead of requiring
* an indirection to the redisContext struct. */
static void __redisAsyncCopyError(redisAsyncContext *ac) {
redisContext *c = &(ac->c);
if (c->error != NULL)
ac->error = c->error;
}
redisAsyncContext *redisAsyncConnect(const char *ip, int port) {
redisContext *c = redisConnectNonBlock(ip,port);
redisAsyncContext *ac = redisAsyncInitialize(c);
__redisAsyncCopyError(ac);
return ac;
}
@ -78,7 +87,8 @@ static void __redisAsyncDisconnect(redisAsyncContext *ac) {
if (ac->evCleanup) ac->evCleanup(ac->data);
/* Execute callback with proper status */
status = (c->error == NULL) ? REDIS_OK : REDIS_ERR;
__redisAsyncCopyError(ac);
status = (ac->error == NULL) ? REDIS_OK : REDIS_ERR;
if (ac->onDisconnect) ac->onDisconnect(ac,status);
/* Cleanup self */

View File

@ -54,6 +54,9 @@ typedef struct redisAsyncContext {
/* Hold the regular context, so it can be realloc'ed. */
redisContext c;
/* Hold a reference to the error object so it can be used directly. */
char *error;
/* Called when the library expects to start reading/writing.
* The supplied functions should be idempotent. */
void (*evAddRead)(void *privdata);