]> git.saurik.com Git - redis.git/blame - deps/hiredis/adapters/ae.h
Update hiredis to 0.9.2
[redis.git] / deps / hiredis / adapters / ae.h
CommitLineData
021321e0
PN
1#include <sys/types.h>
2#include <ae.h>
3#include "../hiredis.h"
4#include "../async.h"
5
6typedef struct redisAeEvents {
7 redisAsyncContext *context;
8 aeEventLoop *loop;
9 int fd;
10 int reading, writing;
11} redisAeEvents;
12
13void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
14 ((void)el); ((void)fd); ((void)mask);
15
16 redisAeEvents *e = (redisAeEvents*)privdata;
17 redisAsyncHandleRead(e->context);
18}
19
20void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
21 ((void)el); ((void)fd); ((void)mask);
22
23 redisAeEvents *e = (redisAeEvents*)privdata;
24 redisAsyncHandleWrite(e->context);
25}
26
27void redisAeAddRead(void *privdata) {
28 redisAeEvents *e = (redisAeEvents*)privdata;
29 aeEventLoop *loop = e->loop;
30 if (!e->reading) {
31 e->reading = 1;
32 aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e);
33 }
34}
35
36void redisAeDelRead(void *privdata) {
37 redisAeEvents *e = (redisAeEvents*)privdata;
38 aeEventLoop *loop = e->loop;
39 if (e->reading) {
40 e->reading = 0;
41 aeDeleteFileEvent(loop,e->fd,AE_READABLE);
42 }
43}
44
45void redisAeAddWrite(void *privdata) {
46 redisAeEvents *e = (redisAeEvents*)privdata;
47 aeEventLoop *loop = e->loop;
48 if (!e->writing) {
49 e->writing = 1;
50 aeCreateFileEvent(loop,e->fd,AE_WRITABLE,redisAeWriteEvent,e);
51 }
52}
53
54void redisAeDelWrite(void *privdata) {
55 redisAeEvents *e = (redisAeEvents*)privdata;
56 aeEventLoop *loop = e->loop;
57 if (e->writing) {
58 e->writing = 0;
59 aeDeleteFileEvent(loop,e->fd,AE_WRITABLE);
60 }
61}
62
63void redisAeCleanup(void *privdata) {
64 redisAeEvents *e = (redisAeEvents*)privdata;
65 redisAeDelRead(privdata);
66 redisAeDelWrite(privdata);
67 free(e);
68}
69
70int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
71 redisContext *c = &(ac->c);
72 redisAeEvents *e;
73
74 /* Nothing should be attached when something is already attached */
75 if (ac->_adapter_data != NULL)
76 return REDIS_ERR;
77
78 /* Create container for context and r/w events */
79 e = (redisAeEvents*)malloc(sizeof(*e));
80 e->context = ac;
81 e->loop = loop;
82 e->fd = c->fd;
83 e->reading = e->writing = 0;
84
85 /* Register functions to start/stop listening for events */
86 ac->evAddRead = redisAeAddRead;
87 ac->evDelRead = redisAeDelRead;
88 ac->evAddWrite = redisAeAddWrite;
89 ac->evDelWrite = redisAeDelWrite;
90 ac->evCleanup = redisAeCleanup;
91 ac->_adapter_data = e;
92
93 return REDIS_OK;
94}
95