diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-12-09 19:13:00 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-12-09 19:13:00 +0300 |
commit | 7ca658607cdeebe0cecbeb310cf2c99af800306f (patch) | |
tree | 0fdca11c2ac98ed15ae54414cd92cd1be8697f85 /contrib/hiredis/adapters/libevent.h | |
parent | 46ceb4ad592937ac210d1fcdfe5ee0f53d317b39 (diff) | |
download | rspamd-7ca658607cdeebe0cecbeb310cf2c99af800306f.tar.gz rspamd-7ca658607cdeebe0cecbeb310cf2c99af800306f.zip |
Add detecting of libhiredis for communicating with kvstorage.
Add internal hiredis if it is not found in system.
Diffstat (limited to 'contrib/hiredis/adapters/libevent.h')
-rw-r--r-- | contrib/hiredis/adapters/libevent.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/contrib/hiredis/adapters/libevent.h b/contrib/hiredis/adapters/libevent.h new file mode 100644 index 000000000..2c1848056 --- /dev/null +++ b/contrib/hiredis/adapters/libevent.h @@ -0,0 +1,75 @@ +#include <event.h> +#include "../hiredis.h" +#include "../async.h" + +typedef struct redisLibeventEvents { + redisAsyncContext *context; + struct event rev, wev; +} redisLibeventEvents; + +void redisLibeventReadEvent(int fd, short event, void *arg) { + ((void)fd); ((void)event); + redisLibeventEvents *e = (redisLibeventEvents*)arg; + redisAsyncHandleRead(e->context); +} + +void redisLibeventWriteEvent(int fd, short event, void *arg) { + ((void)fd); ((void)event); + redisLibeventEvents *e = (redisLibeventEvents*)arg; + redisAsyncHandleWrite(e->context); +} + +void redisLibeventAddRead(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + event_add(&e->rev,NULL); +} + +void redisLibeventDelRead(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + event_del(&e->rev); +} + +void redisLibeventAddWrite(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + event_add(&e->wev,NULL); +} + +void redisLibeventDelWrite(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + event_del(&e->wev); +} + +void redisLibeventCleanup(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + event_del(&e->rev); + event_del(&e->wev); + free(e); +} + +int redisLibeventAttach(redisAsyncContext *ac, struct event_base *base) { + redisContext *c = &(ac->c); + redisLibeventEvents *e; + + /* Nothing should be attached when something is already attached */ + if (ac->ev.data != NULL) + return REDIS_ERR; + + /* Create container for context and r/w events */ + e = (redisLibeventEvents*)malloc(sizeof(*e)); + e->context = ac; + + /* Register functions to start/stop listening for events */ + ac->ev.addRead = redisLibeventAddRead; + ac->ev.delRead = redisLibeventDelRead; + ac->ev.addWrite = redisLibeventAddWrite; + ac->ev.delWrite = redisLibeventDelWrite; + ac->ev.cleanup = redisLibeventCleanup; + ac->ev.data = e; + + /* Initialize and install read/write events */ + event_set(&e->rev,c->fd,EV_READ,redisLibeventReadEvent,e); + event_set(&e->wev,c->fd,EV_WRITE,redisLibeventWriteEvent,e); + event_base_set(base,&e->rev); + event_base_set(base,&e->wev); + return REDIS_OK; +} |