Add an Ivykis adapter
This adds a new adapter and an example for using hiredis with the ivykis async I/O library. Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
This commit is contained in:
parent
2fc31e74b1
commit
3b153cbf9d
3
Makefile
3
Makefile
@ -95,6 +95,9 @@ hiredis-example-libev: examples/example-libev.c adapters/libev.h $(STLIBNAME)
|
|||||||
hiredis-example-glib: examples/example-glib.c adapters/glib.h $(STLIBNAME)
|
hiredis-example-glib: examples/example-glib.c adapters/glib.h $(STLIBNAME)
|
||||||
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) $(shell pkg-config --cflags --libs glib-2.0) -I. $< $(STLIBNAME)
|
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) $(shell pkg-config --cflags --libs glib-2.0) -I. $< $(STLIBNAME)
|
||||||
|
|
||||||
|
hiredis-example-ivykis: examples/example-ivykis.c adapters/ivykis.h $(STLIBNAME)
|
||||||
|
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. $< -livykis $(STLIBNAME)
|
||||||
|
|
||||||
ifndef AE_DIR
|
ifndef AE_DIR
|
||||||
hiredis-example-ae:
|
hiredis-example-ae:
|
||||||
@echo "Please specify AE_DIR (e.g. <redis repository>/src)"
|
@echo "Please specify AE_DIR (e.g. <redis repository>/src)"
|
||||||
|
81
adapters/ivykis.h
Normal file
81
adapters/ivykis.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#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);
|
||||||
|
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*)malloc(sizeof(*e));
|
||||||
|
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
|
58
examples/example-ivykis.c
Normal file
58
examples/example-ivykis.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <hiredis.h>
|
||||||
|
#include <async.h>
|
||||||
|
#include <adapters/ivykis.h>
|
||||||
|
|
||||||
|
void getCallback(redisAsyncContext *c, void *r, void *privdata) {
|
||||||
|
redisReply *reply = r;
|
||||||
|
if (reply == NULL) return;
|
||||||
|
printf("argv[%s]: %s\n", (char*)privdata, reply->str);
|
||||||
|
|
||||||
|
/* Disconnect after receiving the reply to GET */
|
||||||
|
redisAsyncDisconnect(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void connectCallback(const redisAsyncContext *c, int status) {
|
||||||
|
if (status != REDIS_OK) {
|
||||||
|
printf("Error: %s\n", c->errstr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("Connected...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void disconnectCallback(const redisAsyncContext *c, int status) {
|
||||||
|
if (status != REDIS_OK) {
|
||||||
|
printf("Error: %s\n", c->errstr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("Disconnected...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv) {
|
||||||
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
iv_init();
|
||||||
|
|
||||||
|
redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
|
||||||
|
if (c->err) {
|
||||||
|
/* Let *c leak for now... */
|
||||||
|
printf("Error: %s\n", c->errstr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
redisIvykisAttach(c);
|
||||||
|
redisAsyncSetConnectCallback(c,connectCallback);
|
||||||
|
redisAsyncSetDisconnectCallback(c,disconnectCallback);
|
||||||
|
redisAsyncCommand(c, NULL, NULL, "SET key %b", argv[argc-1], strlen(argv[argc-1]));
|
||||||
|
redisAsyncCommand(c, getCallback, (char*)"end-1", "GET key");
|
||||||
|
|
||||||
|
iv_main();
|
||||||
|
|
||||||
|
iv_deinit();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user