aboutsummaryrefslogtreecommitdiffstats
path: root/src/loop.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/loop.c')
-rw-r--r--src/loop.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/loop.c b/src/loop.c
index e361600..0f88c26 100644
--- a/src/loop.c
+++ b/src/loop.c
@@ -1,5 +1,15 @@
+#include <stdlib.h>
+
#include "runes.h"
+struct runes_loop_timer_data {
+ RunesTerm *t;
+ void (*cb)(RunesTerm*);
+};
+
+static void runes_loop_timer_cb(uv_timer_t *handle);
+static void runes_loop_free_handle(uv_handle_t *handle);
+
void runes_loop_init(RunesTerm *t)
{
RunesLoop *loop = &t->loop;
@@ -16,9 +26,39 @@ void runes_loop_run(RunesTerm *t)
uv_run(loop->loop, UV_RUN_DEFAULT);
}
+void runes_loop_timer_set(RunesTerm *t, int timeout, int repeat,
+ void (*cb)(RunesTerm*))
+{
+ RunesLoop *loop = &t->loop;
+ 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);
+}
+
void runes_loop_cleanup(RunesTerm *t)
{
RunesLoop *loop = &t->loop;
uv_loop_close(loop->loop);
}
+
+static void runes_loop_timer_cb(uv_timer_t *handle)
+{
+ struct runes_loop_timer_data *data = handle->data;
+ 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);
+}