Skip to content

Commit

Permalink
Add timeout support to libhv adapter.
Browse files Browse the repository at this point in the history
See: #904
  • Loading branch information
michael-grunder committed Sep 13, 2022
1 parent 5392adc commit d1cc536
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
18 changes: 18 additions & 0 deletions adapters/libhv.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,23 @@ static void redisLibhvCleanup(void *privdata) {
hevent_set_userdata(io, NULL);
}

static void redisLibhvTimeout(htimer_t* timer) {
hio_t* io = (hio_t*)hevent_userdata(timer);
redisAsyncHandleTimeout(hevent_userdata(io));
}

static void redisLibhvSetTimeout(void *privdata, struct timeval tv) {
hio_t* io = (hio_t*)privdata;
hloop_t* loop = hevent_loop(io);
htimer_t *timer;
uint32_t millis;

millis = tv.tv_sec * 1000 + tv.tv_usec / 1000;
timer = htimer_add(loop, redisLibhvTimeout, millis, 1);

hevent_set_userdata(timer, io);
}

static int redisLibhvAttach(redisAsyncContext* ac, hloop_t* loop) {
redisContext *c = &(ac->c);
hio_t* io = NULL;
Expand All @@ -62,6 +79,7 @@ static int redisLibhvAttach(redisAsyncContext* ac, hloop_t* loop) {
ac->ev.addWrite = redisLibhvAddWrite;
ac->ev.delWrite = redisLibhvDelWrite;
ac->ev.cleanup = redisLibhvCleanup;
ac->ev.scheduleTimer = redisLibhvSetTimeout;
ac->ev.data = io;

return REDIS_OK;
Expand Down
15 changes: 15 additions & 0 deletions examples/example-libhv.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@ void getCallback(redisAsyncContext *c, void *r, void *privdata) {
redisAsyncDisconnect(c);
}

void debugCallback(redisAsyncContext *c, void *r, void *privdata) {
(void)privdata;
redisReply *reply = r;

if (reply == NULL) {
printf("`DEBUG SLEEP` error: %s\n", c->errstr ? c->errstr : "unknown error");
return;
}

redisAsyncDisconnect(c);
}

void connectCallback(const redisAsyncContext *c, int status) {
if (status != REDIS_OK) {
printf("Error: %s\n", c->errstr);
Expand Down Expand Up @@ -46,10 +58,13 @@ int main (int argc, char **argv) {

hloop_t* loop = hloop_new(HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS);
redisLibhvAttach(c, loop);
redisAsyncSetTimeout(c, (struct timeval){.tv_sec = 0, .tv_usec = 500000});
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");
redisAsyncCommand(c, debugCallback, NULL, "DEBUG SLEEP %d", 1);
hloop_run(loop);
hloop_free(&loop);
return 0;
}

0 comments on commit d1cc536

Please sign in to comment.