diff options
author | Jesse Luehrs <doy@tozt.net> | 2016-05-12 16:03:27 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2016-05-12 16:03:27 -0400 |
commit | aca98a4b2c9d0be48be773fbf438a8477698ef14 (patch) | |
tree | 9d629a3c71085aae7f6126ebd05e70b88cefb0f6 /src/loop.c | |
parent | e9f28194fb4dd8eec1be7b2cde81fadc60dc78ff (diff) | |
download | runes-aca98a4b2c9d0be48be773fbf438a8477698ef14.tar.gz runes-aca98a4b2c9d0be48be773fbf438a8477698ef14.zip |
convert to libevent
also remove all code supporting threading stuff
Diffstat (limited to 'src/loop.c')
-rw-r--r-- | src/loop.c | 109 |
1 files changed, 49 insertions, 60 deletions
@@ -1,117 +1,106 @@ #include <stdlib.h> +#include <sys/time.h> #include "runes.h" #include "loop.h" struct runes_loop_data { - uv_work_t req; - RunesLoop *loop; + struct event *event; void *t; - void (*work_cb)(void*); - int (*after_work_cb)(void*); + int (*cb)(void*); }; struct runes_loop_timer_data { + struct event *event; + struct timeval *timeout; void *t; void (*cb)(void*); }; -static void runes_loop_do_work(uv_work_t *req); -static void runes_loop_do_after_work(uv_work_t *req, int status); -static void runes_loop_timer_cb(uv_timer_t *handle); -static void runes_loop_free_handle(uv_handle_t *handle); +static void runes_loop_work_cb(evutil_socket_t fd, short what, void *arg); +static void runes_loop_timer_cb(evutil_socket_t fd, short what, void *arg); RunesLoop *runes_loop_new() { RunesLoop *loop; loop = calloc(1, sizeof(RunesLoop)); - loop->loop = uv_default_loop(); + loop->base = event_base_new(); return loop; } void runes_loop_run(RunesLoop *loop) { - uv_run(loop->loop, UV_RUN_DEFAULT); + event_base_dispatch(loop->base); } -void runes_loop_start_work(RunesLoop *loop, void *t, - void (*work_cb)(void*), - int (*after_work_cb)(void*)) +void runes_loop_start_work( + RunesLoop *loop, int fd, void *t, int (*cb)(void*)) { struct runes_loop_data *data; data = malloc(sizeof(struct runes_loop_data)); - data->req.data = data; - data->loop = loop; + data->event = event_new(loop->base, fd, EV_READ, runes_loop_work_cb, data); data->t = t; - data->work_cb = work_cb; - data->after_work_cb = after_work_cb; + data->cb = cb; - uv_queue_work(loop->loop, (void*)data, runes_loop_do_work, - runes_loop_do_after_work); + event_add(data->event, NULL); } -void runes_loop_timer_set(RunesLoop *loop, int timeout, int repeat, - void *t, void (*cb)(void*)) +void runes_loop_timer_set( + RunesLoop *loop, int timeout, void *t, void (*cb)(void*)) { - uv_timer_t *timer_req; - struct runes_loop_timer_data *timer_data; - - timer_req = malloc(sizeof(uv_timer_t)); - uv_timer_init(loop->loop, timer_req); - timer_data = malloc(sizeof(struct runes_loop_timer_data)); - timer_data->t = t; - timer_data->cb = cb; - timer_req->data = (void *)timer_data; - uv_timer_start(timer_req, runes_loop_timer_cb, timeout, repeat); -} + struct runes_loop_timer_data *data; -void runes_loop_delete(RunesLoop *loop) -{ - uv_loop_close(loop->loop); + data = malloc(sizeof(struct runes_loop_timer_data)); + data->event = event_new(loop->base, -1, 0, runes_loop_timer_cb, data); + data->t = t; + data->cb = cb; + data->timeout = malloc(sizeof(struct timeval)); + data->timeout->tv_sec = 0; + while (timeout >= 1000) { + data->timeout->tv_sec += 1; + timeout -= 1000; + } + data->timeout->tv_usec = timeout * 1000; - free(loop); + event_add(data->event, data->timeout); } -static void runes_loop_do_work(uv_work_t *req) +void runes_loop_delete(RunesLoop *loop) { - struct runes_loop_data *data = req->data; - void *t = data->t; + event_base_free(loop->base); - data->work_cb(t); + free(loop); } -static void runes_loop_do_after_work(uv_work_t *req, int status) +static void runes_loop_work_cb(evutil_socket_t fd, short what, void *arg) { - struct runes_loop_data *data = req->data; - RunesLoop *loop = data->loop; - void *t = data->t; - int should_loop = 0; + struct runes_loop_data *data = arg; - UNUSED(status); + UNUSED(fd); + UNUSED(what); - should_loop = data->after_work_cb(t); - if (should_loop) { - uv_queue_work(loop->loop, req, runes_loop_do_work, - runes_loop_do_after_work); + if (data->cb(data->t)) { + event_add(data->event, NULL); } else { - free(req); + event_free(data->event); + free(data); } } -static void runes_loop_timer_cb(uv_timer_t *handle) +static void runes_loop_timer_cb(evutil_socket_t fd, short what, void *arg) { - struct runes_loop_timer_data *data = handle->data; + struct runes_loop_timer_data *data = arg; + + UNUSED(fd); + UNUSED(what); + data->cb(data->t); - uv_close( - (uv_handle_t *)handle, runes_loop_free_handle); -} -static void runes_loop_free_handle(uv_handle_t *handle) -{ - free(handle->data); - free(handle); + event_free(data->event); + free(data->timeout); + free(data); } |