aboutsummaryrefslogtreecommitdiff
path: root/examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h')
-rw-r--r--examples/redis-unstable/deps/hiredis/adapters/redismoduleapi.h144
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
11typedef 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
20static 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
28static 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
36static 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
44static 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
52static 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
60static 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
68static 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
76static 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
84static 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
92static 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. */
103static 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
113static 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