2012-02-19 19:26:36 +00:00
|
|
|
#ifndef __HIREDIS_AE_H__
|
|
|
|
#define __HIREDIS_AE_H__
|
2010-12-16 22:32:02 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <ae.h>
|
|
|
|
#include "../hiredis.h"
|
|
|
|
#include "../async.h"
|
|
|
|
|
|
|
|
typedef struct redisAeEvents {
|
|
|
|
redisAsyncContext *context;
|
|
|
|
aeEventLoop *loop;
|
|
|
|
int fd;
|
|
|
|
int reading, writing;
|
|
|
|
} redisAeEvents;
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
|
2010-12-16 22:32:02 +00:00
|
|
|
((void)el); ((void)fd); ((void)mask);
|
|
|
|
|
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
redisAsyncHandleRead(e->context);
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
|
2010-12-16 22:32:02 +00:00
|
|
|
((void)el); ((void)fd); ((void)mask);
|
|
|
|
|
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
redisAsyncHandleWrite(e->context);
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeAddRead(void *privdata) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
aeEventLoop *loop = e->loop;
|
|
|
|
if (!e->reading) {
|
|
|
|
e->reading = 1;
|
|
|
|
aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeDelRead(void *privdata) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
aeEventLoop *loop = e->loop;
|
|
|
|
if (e->reading) {
|
|
|
|
e->reading = 0;
|
|
|
|
aeDeleteFileEvent(loop,e->fd,AE_READABLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeAddWrite(void *privdata) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
aeEventLoop *loop = e->loop;
|
|
|
|
if (!e->writing) {
|
|
|
|
e->writing = 1;
|
|
|
|
aeCreateFileEvent(loop,e->fd,AE_WRITABLE,redisAeWriteEvent,e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeDelWrite(void *privdata) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
aeEventLoop *loop = e->loop;
|
|
|
|
if (e->writing) {
|
|
|
|
e->writing = 0;
|
|
|
|
aeDeleteFileEvent(loop,e->fd,AE_WRITABLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static void redisAeCleanup(void *privdata) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisAeEvents *e = (redisAeEvents*)privdata;
|
|
|
|
redisAeDelRead(privdata);
|
|
|
|
redisAeDelWrite(privdata);
|
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
2012-02-19 19:26:36 +00:00
|
|
|
static int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
|
2010-12-16 22:32:02 +00:00
|
|
|
redisContext *c = &(ac->c);
|
|
|
|
redisAeEvents *e;
|
|
|
|
|
|
|
|
/* Nothing should be attached when something is already attached */
|
2012-02-19 19:26:36 +00:00
|
|
|
if (ac->ev.data != NULL)
|
2010-12-16 22:32:02 +00:00
|
|
|
return REDIS_ERR;
|
|
|
|
|
|
|
|
/* Create container for context and r/w events */
|
|
|
|
e = (redisAeEvents*)malloc(sizeof(*e));
|
|
|
|
e->context = ac;
|
|
|
|
e->loop = loop;
|
|
|
|
e->fd = c->fd;
|
|
|
|
e->reading = e->writing = 0;
|
|
|
|
|
|
|
|
/* Register functions to start/stop listening for events */
|
2012-02-19 19:26:36 +00:00
|
|
|
ac->ev.addRead = redisAeAddRead;
|
|
|
|
ac->ev.delRead = redisAeDelRead;
|
|
|
|
ac->ev.addWrite = redisAeAddWrite;
|
|
|
|
ac->ev.delWrite = redisAeDelWrite;
|
|
|
|
ac->ev.cleanup = redisAeCleanup;
|
|
|
|
ac->ev.data = e;
|
2010-12-16 22:32:02 +00:00
|
|
|
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
2012-02-19 19:26:36 +00:00
|
|
|
#endif
|