diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2010-09-25 22:31:07 +0200 |
---|---|---|
committer | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2010-09-25 22:31:07 +0200 |
commit | 1c245845eda46512ed3eb5f7e502c3b7f535ac89 (patch) | |
tree | 33f84140f8bccd32a6c57255f669c0196bddfdf8 | |
parent | 8345467b2e391aa0e62414d48abcc15c6291d945 (diff) |
Trigger callbacks when a command is issued or the context is free'd
-rw-r--r-- | hiredis.c | 21 | ||||
-rw-r--r-- | hiredis.h | 22 |
2 files changed, 38 insertions, 5 deletions
@@ -575,7 +575,7 @@ static int redisContextConnect(redisContext *c, const char *ip, int port) { } static redisContext *redisContextInit(redisReplyFunctions *fn) { - redisContext *c = malloc(sizeof(*c)); + redisContext *c = calloc(sizeof(redisContext),1); c->error = NULL; c->obuf = sdsempty(); c->fn = fn == NULL ? &defaultFunctions : fn; @@ -587,6 +587,8 @@ static redisContext *redisContextInit(redisReplyFunctions *fn) { } void redisFree(redisContext *c) { + if (c->cbFree != NULL) + c->cbFree(c,c->privdataFree); if (c->error != NULL) sdsfree(c->error); if (c->obuf != NULL) @@ -614,6 +616,19 @@ redisContext *redisConnectNonBlock(const char *ip, int port, redisReplyFunctions return c; } +/* Register callback that is triggered when a command is put in the output + * buffer when the context is non-blocking. */ +void redisSetCommandCallback(redisContext *c, redisContextCallback *fn, void *privdata) { + c->cbCommand = fn; + c->privdataCommand = privdata; +} + +/* Register callback that is triggered when the context is free'd. */ +void redisSetFreeCallback(redisContext *c, redisContextCallback *fn, void *privdata) { + c->cbFree = fn; + c->privdataFree = privdata; +} + /* Use this function to handle a read event on the descriptor. It will try * and read some bytes from the socket and feed them to the reply parser. * @@ -749,6 +764,10 @@ static int redisCommandWriteNonBlock(redisContext *c, redisCallback *cb, char *s } c->cpos++; + /* Fire write callback */ + if (c->cbCommand != NULL) + c->cbCommand(c,c->privdataCommand); + return REDIS_OK; } @@ -70,11 +70,13 @@ typedef struct redisReplyObjectFunctions { void (*freeObject)(void*); } redisReplyFunctions; -/* Callback prototype */ -struct redisContext; /* needs forward declaration of redisContext */ -typedef void redisCallbackFn(struct redisContext*, redisReply*, void*); +struct redisContext; /* need forward declaration of redisContext */ + +/* Callbacks triggered on non-reply events. */ +typedef void (redisContextCallback)(struct redisContext*, void*); -/* Callback container */ +/* Reply callback prototype and container */ +typedef void redisCallbackFn(struct redisContext*, redisReply*, void*); typedef struct redisCallback { redisCallbackFn *fn; void *privdata; @@ -86,8 +88,18 @@ typedef struct redisContext { int flags; sds error; /* Error object is set when in erronous state */ sds obuf; /* Write buffer */ + + /* Function set for reply buildup and reply reader */ redisReplyFunctions *fn; void *reader; + + /* Non-reply callbacks */ + redisContextCallback *cbCommand; + void *privdataCommand; + redisContextCallback *cbFree; + void *privdataFree; + + /* Reply callbacks */ redisCallback *callbacks; int cpos; int clen; @@ -103,6 +115,8 @@ int redisReplyReaderGetReply(void *reader, void **reply); redisContext *redisConnect(const char *ip, int port, redisReplyFunctions *fn); redisContext *redisConnectNonBlock(const char *ip, int port, redisReplyFunctions *fn); +void redisSetCommandCallback(redisContext *c, redisContextCallback *fn, void *privdata); +void redisSetFreeCallback(redisContext *c, redisContextCallback *fn, void *privdata); void redisFree(redisContext *c); int redisBufferRead(redisContext *c); int redisBufferWrite(redisContext *c, int *done); |