diff options
Diffstat (limited to 'examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h')
| -rw-r--r-- | examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h b/examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h new file mode 100644 index 0000000..8a076fe --- /dev/null +++ b/examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h | |||
| @@ -0,0 +1,144 @@ | |||
| 1 | #ifndef __HIREDIS_REDISMODULEAPI_H__ | ||
| 2 | #define __HIREDIS_REDISMODULEAPI_H__ | ||
| 3 | |||
| 4 | #include "redismodule.h" | ||
| 5 | |||
| 6 | #include "../async.h" | ||
| 7 | #include "../hiredis.h" | ||
| 8 | |||
| 9 | #include <sys/types.h> | ||
| 10 | |||
| 11 | typedef struct redisModuleEvents { | ||
| 12 | redisAsyncContext *context; | ||
| 13 | RedisModuleCtx *module_ctx; | ||
| 14 | int fd; | ||
| 15 | int reading, writing; | ||
| 16 | int timer_active; | ||
| 17 | RedisModuleTimerID timer_id; | ||
| 18 | } redisModuleEvents; | ||
| 19 | |||
| 20 | static inline void redisModuleReadEvent(int fd, void *privdata, int mask) { | ||
| 21 | (void) fd; | ||
| 22 | (void) mask; | ||
| 23 | |||
| 24 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 25 | redisAsyncHandleRead(e->context); | ||
| 26 | } | ||
| 27 | |||
| 28 | static inline void redisModuleWriteEvent(int fd, void *privdata, int mask) { | ||
| 29 | (void) fd; | ||
| 30 | (void) mask; | ||
| 31 | |||
| 32 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 33 | redisAsyncHandleWrite(e->context); | ||
| 34 | } | ||
| 35 | |||
| 36 | static inline void redisModuleAddRead(void *privdata) { | ||
| 37 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 38 | if (!e->reading) { | ||
| 39 | e->reading = 1; | ||
| 40 | RedisModule_EventLoopAdd(e->fd, REDISMODULE_EVENTLOOP_READABLE, redisModuleReadEvent, e); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | static inline void redisModuleDelRead(void *privdata) { | ||
| 45 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 46 | if (e->reading) { | ||
| 47 | e->reading = 0; | ||
| 48 | RedisModule_EventLoopDel(e->fd, REDISMODULE_EVENTLOOP_READABLE); | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline void redisModuleAddWrite(void *privdata) { | ||
| 53 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 54 | if (!e->writing) { | ||
| 55 | e->writing = 1; | ||
| 56 | RedisModule_EventLoopAdd(e->fd, REDISMODULE_EVENTLOOP_WRITABLE, redisModuleWriteEvent, e); | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline void redisModuleDelWrite(void *privdata) { | ||
| 61 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 62 | if (e->writing) { | ||
| 63 | e->writing = 0; | ||
| 64 | RedisModule_EventLoopDel(e->fd, REDISMODULE_EVENTLOOP_WRITABLE); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | static inline void redisModuleStopTimer(void *privdata) { | ||
| 69 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 70 | if (e->timer_active) { | ||
| 71 | RedisModule_StopTimer(e->module_ctx, e->timer_id, NULL); | ||
| 72 | } | ||
| 73 | e->timer_active = 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | static inline void redisModuleCleanup(void *privdata) { | ||
| 77 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 78 | redisModuleDelRead(privdata); | ||
| 79 | redisModuleDelWrite(privdata); | ||
| 80 | redisModuleStopTimer(privdata); | ||
| 81 | hi_free(e); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline void redisModuleTimeout(RedisModuleCtx *ctx, void *privdata) { | ||
| 85 | (void) ctx; | ||
| 86 | |||
| 87 | redisModuleEvents *e = (redisModuleEvents*)privdata; | ||
| 88 | e->timer_active = 0; | ||
| 89 | redisAsyncHandleTimeout(e->context); | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline void redisModuleSetTimeout(void *privdata, struct timeval tv) { | ||
| 93 | redisModuleEvents* e = (redisModuleEvents*)privdata; | ||
| 94 | |||
| 95 | redisModuleStopTimer(privdata); | ||
| 96 | |||
| 97 | mstime_t millis = tv.tv_sec * 1000 + tv.tv_usec / 1000.0; | ||
| 98 | e->timer_id = RedisModule_CreateTimer(e->module_ctx, millis, redisModuleTimeout, e); | ||
| 99 | e->timer_active = 1; | ||
| 100 | } | ||
| 101 | |||
| 102 | /* Check if Redis version is compatible with the adapter. */ | ||
| 103 | static inline int redisModuleCompatibilityCheck(void) { | ||
| 104 | if (!RedisModule_EventLoopAdd || | ||
| 105 | !RedisModule_EventLoopDel || | ||
| 106 | !RedisModule_CreateTimer || | ||
| 107 | !RedisModule_StopTimer) { | ||
| 108 | return REDIS_ERR; | ||
| 109 | } | ||
| 110 | return REDIS_OK; | ||
| 111 | } | ||
| 112 | |||
| 113 | static inline int redisModuleAttach(redisAsyncContext *ac, RedisModuleCtx *module_ctx) { | ||
| 114 | redisContext *c = &(ac->c); | ||
| 115 | redisModuleEvents *e; | ||
| 116 | |||
| 117 | /* Nothing should be attached when something is already attached */ | ||
| 118 | if (ac->ev.data != NULL) | ||
| 119 | return REDIS_ERR; | ||
| 120 | |||
| 121 | /* Create container for context and r/w events */ | ||
| 122 | e = (redisModuleEvents*)hi_malloc(sizeof(*e)); | ||
| 123 | if (e == NULL) | ||
| 124 | return REDIS_ERR; | ||
| 125 | |||
| 126 | e->context = ac; | ||
| 127 | e->module_ctx = module_ctx; | ||
| 128 | e->fd = c->fd; | ||
| 129 | e->reading = e->writing = 0; | ||
| 130 | e->timer_active = 0; | ||
| 131 | |||
| 132 | /* Register functions to start/stop listening for events */ | ||
| 133 | ac->ev.addRead = redisModuleAddRead; | ||
| 134 | ac->ev.delRead = redisModuleDelRead; | ||
| 135 | ac->ev.addWrite = redisModuleAddWrite; | ||
| 136 | ac->ev.delWrite = redisModuleDelWrite; | ||
| 137 | ac->ev.cleanup = redisModuleCleanup; | ||
| 138 | ac->ev.scheduleTimer = redisModuleSetTimeout; | ||
| 139 | ac->ev.data = e; | ||
| 140 | |||
| 141 | return REDIS_OK; | ||
| 142 | } | ||
| 143 | |||
| 144 | #endif | ||
