aboutsummaryrefslogtreecommitdiff
path: root/src/lib/include/mainloop.h
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2015-03-11 11:51:01 +0100
committerAlex Auvolat <alex@adnab.me>2015-03-11 11:51:01 +0100
commitbde334e6393b142d9953328e9ea2881ce88a1a7b (patch)
treef3ed7bbc6c8a534fccbd2cf653e7ecb1f24b9fd4 /src/lib/include/mainloop.h
parentaa5e2760711c092e1235105ebf097ac594512370 (diff)
downloadkogata-bde334e6393b142d9953328e9ea2881ce88a1a7b.tar.gz
kogata-bde334e6393b142d9953328e9ea2881ce88a1a7b.zip
Begin work on GIP (Graphics Initiation Protocol)
Diffstat (limited to 'src/lib/include/mainloop.h')
-rw-r--r--src/lib/include/mainloop.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/lib/include/mainloop.h b/src/lib/include/mainloop.h
new file mode 100644
index 0000000..1e71ffb
--- /dev/null
+++ b/src/lib/include/mainloop.h
@@ -0,0 +1,47 @@
+#pragma once
+
+// These functions are not thread safe, their purpose
+// is to multiplex several IO operations on a
+// single thread.
+
+#include <syscall.h>
+
+#define MAINLOOP_MAX_WR_BUFS 4
+
+typedef struct mainloop_fd mainloop_fd_t;
+
+typedef void (*buf_full_callback_t)(mainloop_fd_t *fd);
+typedef void (*fd_error_callback_t)(mainloop_fd_t *fd);
+
+typedef struct {
+ size_t size, written;
+ void* buf;
+ bool must_free;
+} mainloop_wr_buf_t;
+
+typedef struct mainloop_fd {
+ fd_t fd;
+
+ size_t rd_buf_expect_size, rd_buf_filled;
+ void* rd_buf;
+
+ mainloop_wr_buf_t wr_bufs[MAINLOOP_MAX_WR_BUFS];
+
+ void* data;
+
+ buf_full_callback_t rd_on_full;
+ fd_error_callback_t on_error;
+
+ mainloop_fd_t *next;
+} mainloop_fd_t;
+
+void mainloop_add_fd(mainloop_fd_t* fd);
+void mainloop_rm_fd(mainloop_fd_t* fd);
+
+void mainloop_expect(mainloop_fd_t *fd, void* buf, size_t size, buf_full_callback_t cb);
+bool mainloop_nonblocking_write(mainloop_fd_t *fd, void* buf, size_t size, bool must_free_buf);
+
+void mainloop_run();
+void mainloop_exit();
+
+/* vim: set ts=4 sw=4 tw=0 noet :*/