summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2010-09-25 22:31:07 +0200
committerPieter Noordhuis <pcnoordhuis@gmail.com>2010-09-25 22:31:07 +0200
commit1c245845eda46512ed3eb5f7e502c3b7f535ac89 (patch)
tree33f84140f8bccd32a6c57255f669c0196bddfdf8
parent8345467b2e391aa0e62414d48abcc15c6291d945 (diff)
Trigger callbacks when a command is issued or the context is free'd
-rw-r--r--hiredis.c21
-rw-r--r--hiredis.h22
2 files changed, 38 insertions, 5 deletions
diff --git a/hiredis.c b/hiredis.c
index 29968c9..e59919d 100644
--- a/hiredis.c
+++ b/hiredis.c
@@ -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;
}
diff --git a/hiredis.h b/hiredis.h
index 96508ad..72a4077 100644
--- a/hiredis.h
+++ b/hiredis.h
@@ -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);