From a7acd97ad1fd7c152f7620c0224fba624f226796 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Mon, 11 Oct 2010 18:26:38 +0200 Subject: [PATCH] Move event_base code out of libevent.h This removes the need to wrap an event_base pointer in the redisContext struct and allows multiple connections to be used in a single event_base. Also, use the *privdata argument to the provided callbacks to curry the redisEvent struct around. --- extra/hiredis/libevent.h | 17 +++-------------- hiredis.h | 5 ----- libevent-example.c | 6 +++--- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/extra/hiredis/libevent.h b/extra/hiredis/libevent.h index e4bc6f9..4473d59 100644 --- a/extra/hiredis/libevent.h +++ b/extra/hiredis/libevent.h @@ -11,7 +11,6 @@ typedef struct redisEvents { redisContext *context; redisErrorCallback *err; struct event rev, wev; - struct event_base *base; } redisEvents; void redisLibEventRead(int fd, short event, void *arg) { @@ -74,15 +73,7 @@ void redisLibEventOnFree(redisContext *c, void *privdata) { free(e); } -/* Dispatch libevent loop. */ -int redisLibEventDispatch(redisContext *c) { - if (!c->events) { - return -1; - } - return event_base_dispatch(c->events->base); -} - -redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback *err) { +redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback *err, struct event_base *base) { redisEvents *e; redisContext *c = redisConnectNonBlock(ip, port, NULL); if (c->error != NULL) { @@ -94,16 +85,14 @@ redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback e = malloc(sizeof(*e)); e->context = c; e->err = err; - e->base = event_base_new(); - c->events = e; /* Register callbacks and events */ redisSetDisconnectCallback(e->context, redisLibEventOnDisconnect, e); redisSetCommandCallback(e->context, redisLibEventOnWrite, e); redisSetFreeCallback(e->context, redisLibEventOnFree, e); event_set(&e->rev, e->context->fd, EV_READ, redisLibEventRead, e); - event_base_set(e->base, &e->rev); event_set(&e->wev, e->context->fd, EV_WRITE, redisLibEventWrite, e); - event_base_set(e->base, &e->wev); + event_base_set(base, &e->rev); + event_base_set(base, &e->wev); return c; } diff --git a/hiredis.h b/hiredis.h index 2dcc492..6333028 100644 --- a/hiredis.h +++ b/hiredis.h @@ -75,7 +75,6 @@ typedef struct redisReplyObjectFunctions { } redisReplyFunctions; struct redisContext; /* need forward declaration of redisContext */ -struct redisEvents; /* need forward declaration of redisEvents */ /* Callbacks triggered on non-reply events. */ typedef void (redisContextCallback)(struct redisContext*, void*); @@ -110,10 +109,6 @@ typedef struct redisContext { redisCallback *callbacks; int cpos; int clen; - - /* Libevent context */ - struct redisEvents *events; - } redisContext; void freeReplyObject(void *reply); diff --git a/libevent-example.c b/libevent-example.c index 93273a9..dd36604 100644 --- a/libevent-example.c +++ b/libevent-example.c @@ -20,14 +20,14 @@ void errorCallback(redisContext *c) { int main (int argc, char **argv) { signal(SIGPIPE, SIG_IGN); - event_init(); + struct event_base *base = event_base_new(); - redisContext *c = redisLibEventConnect("127.0.0.1", 6379, errorCallback); + redisContext *c = redisLibEventConnect("127.0.0.1", 6379, errorCallback, base); if (c == NULL) return 1; redisCommand(c, "SET key %b", argv[argc-1], strlen(argv[argc-1])); redisCommandWithCallback(c, getCallback, "end-1", "GET key"); - redisLibEventDispatch(c); + event_base_dispatch(base); redisFree(c); return 0; }