8e0264cfd6
* Adds an indirection to every allocation/deallocation to allow users to plug in ones of their choosing (use custom functions, jemalloc, etc). * Gracefully handle OOM everywhere in hiredis. This should make it possible for users of the library to have more flexibility in how they handle such situations. * Changes `redisReaderTask->elements` from an `int` to a `long long` to prevent a possible overflow when transferring the task elements into a `redisReply`. * Adds a configurable `max elements` member to `redisReader` that defaults to 2^32 - 1. This can be set to "unlimited" by setting the value to zero.
85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
#ifndef __HIREDIS_IVYKIS_H__
|
|
#define __HIREDIS_IVYKIS_H__
|
|
#include <iv.h>
|
|
#include "../hiredis.h"
|
|
#include "../async.h"
|
|
|
|
typedef struct redisIvykisEvents {
|
|
redisAsyncContext *context;
|
|
struct iv_fd fd;
|
|
} redisIvykisEvents;
|
|
|
|
static void redisIvykisReadEvent(void *arg) {
|
|
redisAsyncContext *context = (redisAsyncContext *)arg;
|
|
redisAsyncHandleRead(context);
|
|
}
|
|
|
|
static void redisIvykisWriteEvent(void *arg) {
|
|
redisAsyncContext *context = (redisAsyncContext *)arg;
|
|
redisAsyncHandleWrite(context);
|
|
}
|
|
|
|
static void redisIvykisAddRead(void *privdata) {
|
|
redisIvykisEvents *e = (redisIvykisEvents*)privdata;
|
|
iv_fd_set_handler_in(&e->fd, redisIvykisReadEvent);
|
|
}
|
|
|
|
static void redisIvykisDelRead(void *privdata) {
|
|
redisIvykisEvents *e = (redisIvykisEvents*)privdata;
|
|
iv_fd_set_handler_in(&e->fd, NULL);
|
|
}
|
|
|
|
static void redisIvykisAddWrite(void *privdata) {
|
|
redisIvykisEvents *e = (redisIvykisEvents*)privdata;
|
|
iv_fd_set_handler_out(&e->fd, redisIvykisWriteEvent);
|
|
}
|
|
|
|
static void redisIvykisDelWrite(void *privdata) {
|
|
redisIvykisEvents *e = (redisIvykisEvents*)privdata;
|
|
iv_fd_set_handler_out(&e->fd, NULL);
|
|
}
|
|
|
|
static void redisIvykisCleanup(void *privdata) {
|
|
redisIvykisEvents *e = (redisIvykisEvents*)privdata;
|
|
|
|
iv_fd_unregister(&e->fd);
|
|
hi_free(e);
|
|
}
|
|
|
|
static int redisIvykisAttach(redisAsyncContext *ac) {
|
|
redisContext *c = &(ac->c);
|
|
redisIvykisEvents *e;
|
|
|
|
/* Nothing should be attached when something is already attached */
|
|
if (ac->ev.data != NULL)
|
|
return REDIS_ERR;
|
|
|
|
/* Create container for context and r/w events */
|
|
e = (redisIvykisEvents*)hi_malloc(sizeof(*e));
|
|
if (e == NULL)
|
|
return REDIS_ERR;
|
|
|
|
e->context = ac;
|
|
|
|
/* Register functions to start/stop listening for events */
|
|
ac->ev.addRead = redisIvykisAddRead;
|
|
ac->ev.delRead = redisIvykisDelRead;
|
|
ac->ev.addWrite = redisIvykisAddWrite;
|
|
ac->ev.delWrite = redisIvykisDelWrite;
|
|
ac->ev.cleanup = redisIvykisCleanup;
|
|
ac->ev.data = e;
|
|
|
|
/* Initialize and install read/write events */
|
|
IV_FD_INIT(&e->fd);
|
|
e->fd.fd = c->fd;
|
|
e->fd.handler_in = redisIvykisReadEvent;
|
|
e->fd.handler_out = redisIvykisWriteEvent;
|
|
e->fd.handler_err = NULL;
|
|
e->fd.cookie = e->context;
|
|
|
|
iv_fd_register(&e->fd);
|
|
|
|
return REDIS_OK;
|
|
}
|
|
#endif
|