1 #ifndef __HIREDIS_IVYKIS_H__ 2 #define __HIREDIS_IVYKIS_H__ 3 #include <iv.h> 4 #include "../hiredis.h" 5 #include "../async.h" 6 7 typedef struct redisIvykisEvents { 8 redisAsyncContext *context; 9 struct iv_fd fd; 10 } redisIvykisEvents; 11 redisIvykisReadEvent(void * arg)12static void redisIvykisReadEvent(void *arg) { 13 redisAsyncContext *context = (redisAsyncContext *)arg; 14 redisAsyncHandleRead(context); 15 } 16 redisIvykisWriteEvent(void * arg)17static void redisIvykisWriteEvent(void *arg) { 18 redisAsyncContext *context = (redisAsyncContext *)arg; 19 redisAsyncHandleWrite(context); 20 } 21 redisIvykisAddRead(void * privdata)22static void redisIvykisAddRead(void *privdata) { 23 redisIvykisEvents *e = (redisIvykisEvents*)privdata; 24 iv_fd_set_handler_in(&e->fd, redisIvykisReadEvent); 25 } 26 redisIvykisDelRead(void * privdata)27static void redisIvykisDelRead(void *privdata) { 28 redisIvykisEvents *e = (redisIvykisEvents*)privdata; 29 iv_fd_set_handler_in(&e->fd, NULL); 30 } 31 redisIvykisAddWrite(void * privdata)32static void redisIvykisAddWrite(void *privdata) { 33 redisIvykisEvents *e = (redisIvykisEvents*)privdata; 34 iv_fd_set_handler_out(&e->fd, redisIvykisWriteEvent); 35 } 36 redisIvykisDelWrite(void * privdata)37static void redisIvykisDelWrite(void *privdata) { 38 redisIvykisEvents *e = (redisIvykisEvents*)privdata; 39 iv_fd_set_handler_out(&e->fd, NULL); 40 } 41 redisIvykisCleanup(void * privdata)42static void redisIvykisCleanup(void *privdata) { 43 redisIvykisEvents *e = (redisIvykisEvents*)privdata; 44 45 iv_fd_unregister(&e->fd); 46 free(e); 47 } 48 redisIvykisAttach(redisAsyncContext * ac)49static int redisIvykisAttach(redisAsyncContext *ac) { 50 redisContext *c = &(ac->c); 51 redisIvykisEvents *e; 52 53 /* Nothing should be attached when something is already attached */ 54 if (ac->ev.data != NULL) 55 return REDIS_ERR; 56 57 /* Create container for context and r/w events */ 58 e = (redisIvykisEvents*)malloc(sizeof(*e)); 59 e->context = ac; 60 61 /* Register functions to start/stop listening for events */ 62 ac->ev.addRead = redisIvykisAddRead; 63 ac->ev.delRead = redisIvykisDelRead; 64 ac->ev.addWrite = redisIvykisAddWrite; 65 ac->ev.delWrite = redisIvykisDelWrite; 66 ac->ev.cleanup = redisIvykisCleanup; 67 ac->ev.data = e; 68 69 /* Initialize and install read/write events */ 70 IV_FD_INIT(&e->fd); 71 e->fd.fd = c->fd; 72 e->fd.handler_in = redisIvykisReadEvent; 73 e->fd.handler_out = redisIvykisWriteEvent; 74 e->fd.handler_err = NULL; 75 e->fd.cookie = e->context; 76 77 iv_fd_register(&e->fd); 78 79 return REDIS_OK; 80 } 81 #endif 82