Commit a7acd97a authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

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.
parent 135e9265
...@@ -11,7 +11,6 @@ typedef struct redisEvents { ...@@ -11,7 +11,6 @@ typedef struct redisEvents {
redisContext *context; redisContext *context;
redisErrorCallback *err; redisErrorCallback *err;
struct event rev, wev; struct event rev, wev;
struct event_base *base;
} redisEvents; } redisEvents;
void redisLibEventRead(int fd, short event, void *arg) { void redisLibEventRead(int fd, short event, void *arg) {
...@@ -74,15 +73,7 @@ void redisLibEventOnFree(redisContext *c, void *privdata) { ...@@ -74,15 +73,7 @@ void redisLibEventOnFree(redisContext *c, void *privdata) {
free(e); free(e);
} }
/* Dispatch libevent loop. */ redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback *err, struct event_base *base) {
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) {
redisEvents *e; redisEvents *e;
redisContext *c = redisConnectNonBlock(ip, port, NULL); redisContext *c = redisConnectNonBlock(ip, port, NULL);
if (c->error != NULL) { if (c->error != NULL) {
...@@ -94,16 +85,14 @@ redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback ...@@ -94,16 +85,14 @@ redisContext *redisLibEventConnect(const char *ip, int port, redisErrorCallback
e = malloc(sizeof(*e)); e = malloc(sizeof(*e));
e->context = c; e->context = c;
e->err = err; e->err = err;
e->base = event_base_new();
c->events = e;
/* Register callbacks and events */ /* Register callbacks and events */
redisSetDisconnectCallback(e->context, redisLibEventOnDisconnect, e); redisSetDisconnectCallback(e->context, redisLibEventOnDisconnect, e);
redisSetCommandCallback(e->context, redisLibEventOnWrite, e); redisSetCommandCallback(e->context, redisLibEventOnWrite, e);
redisSetFreeCallback(e->context, redisLibEventOnFree, e); redisSetFreeCallback(e->context, redisLibEventOnFree, e);
event_set(&e->rev, e->context->fd, EV_READ, redisLibEventRead, 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_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; return c;
} }
...@@ -75,7 +75,6 @@ typedef struct redisReplyObjectFunctions { ...@@ -75,7 +75,6 @@ typedef struct redisReplyObjectFunctions {
} redisReplyFunctions; } redisReplyFunctions;
struct redisContext; /* need forward declaration of redisContext */ struct redisContext; /* need forward declaration of redisContext */
struct redisEvents; /* need forward declaration of redisEvents */
/* Callbacks triggered on non-reply events. */ /* Callbacks triggered on non-reply events. */
typedef void (redisContextCallback)(struct redisContext*, void*); typedef void (redisContextCallback)(struct redisContext*, void*);
...@@ -110,10 +109,6 @@ typedef struct redisContext { ...@@ -110,10 +109,6 @@ typedef struct redisContext {
redisCallback *callbacks; redisCallback *callbacks;
int cpos; int cpos;
int clen; int clen;
/* Libevent context */
struct redisEvents *events;
} redisContext; } redisContext;
void freeReplyObject(void *reply); void freeReplyObject(void *reply);
......
...@@ -20,14 +20,14 @@ void errorCallback(redisContext *c) { ...@@ -20,14 +20,14 @@ void errorCallback(redisContext *c) {
int main (int argc, char **argv) { int main (int argc, char **argv) {
signal(SIGPIPE, SIG_IGN); 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; if (c == NULL) return 1;
redisCommand(c, "SET key %b", argv[argc-1], strlen(argv[argc-1])); redisCommand(c, "SET key %b", argv[argc-1], strlen(argv[argc-1]));
redisCommandWithCallback(c, getCallback, "end-1", "GET key"); redisCommandWithCallback(c, getCallback, "end-1", "GET key");
redisLibEventDispatch(c); event_base_dispatch(base);
redisFree(c); redisFree(c);
return 0; return 0;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment