aboutsummaryrefslogtreecommitdiff
path: root/include/poller.h
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2020-07-31 00:22:18 +0200
committerKenny Levinsen <kl@kl.wtf>2020-07-31 00:22:18 +0200
commit61716a2c77dfde9addf6b41a6d72d26a8584150e (patch)
tree537cd84661955497bdb304f88896e36896df4e5f /include/poller.h
parentf85434de666f10da0cbcaccdbb7d88917c5fa887 (diff)
Initial implementation of seatd and libseat
Diffstat (limited to 'include/poller.h')
-rw-r--r--include/poller.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/include/poller.h b/include/poller.h
new file mode 100644
index 0000000..f867df9
--- /dev/null
+++ b/include/poller.h
@@ -0,0 +1,137 @@
+#ifndef _SEATD_POLLER_H
+#define _SEATD_POLLER_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+struct poller;
+struct event_source_fd;
+struct event_source_signal;
+
+/*
+ * These are the event types available from the poller.
+ */
+#define EVENT_READABLE 0x1
+#define EVENT_WRITABLE 0x4
+#define EVENT_ERROR 0x8
+#define EVENT_HANGUP 0x10
+
+/**
+ * The callback type used by event_source_fd, passed to poller_add_fd.
+ */
+typedef int (*event_source_fd_func_t)(int fd, uint32_t mask, void *data);
+
+/**
+ * The interface that an event_source_fd must implement.
+ */
+struct event_source_fd_impl {
+ int (*update)(struct event_source_fd *event_source, uint32_t mask);
+ int (*destroy)(struct event_source_fd *event_source);
+};
+
+/**
+ * The fd poller base class. This must be created by poller_add_fd.
+ */
+struct event_source_fd {
+ const struct event_source_fd_impl *impl;
+ event_source_fd_func_t func;
+
+ int fd;
+ uint32_t mask;
+ void *data;
+};
+
+/**
+ * Removes the event_source_fd from the poller and frees the structure.
+ */
+int event_source_fd_destroy(struct event_source_fd *event_source);
+
+/**
+ * Updates the poll mask applied to this fd, effective on the next poll.
+ */
+int event_source_fd_update(struct event_source_fd *event_source, uint32_t mask);
+
+/**
+ * The callback type used by event_source_signal, passed to poller_add_signal.
+ */
+typedef int (*event_source_signal_func_t)(int signal, void *data);
+
+/**
+ * The interface that an event_source_signal must implement.
+ */
+struct event_source_signal_impl {
+ int (*destroy)(struct event_source_signal *event_source);
+};
+
+/*
+ * The signal poller base class. This must be created by poller_add_signal.
+ */
+struct event_source_signal {
+ const struct event_source_signal_impl *impl;
+ event_source_signal_func_t func;
+
+ int signal;
+ void *data;
+};
+
+/**
+ * Removes the event_source_siganl from the poller and frees the structure.
+ */
+int event_source_signal_destroy(struct event_source_signal *event_source);
+
+/**
+ * The interface that a poll backend must implement.
+ */
+struct poll_impl {
+ struct poller *(*create)(void);
+ int (*destroy)(struct poller *);
+
+ struct event_source_fd *(*add_fd)(struct poller *, int fd, uint32_t mask,
+ event_source_fd_func_t func, void *data);
+ struct event_source_signal *(*add_signal)(struct poller *, int signal,
+ event_source_signal_func_t func, void *data);
+
+ int (*poll)(struct poller *);
+};
+
+/**
+ * The poller base class. This must be created by poller_create.
+ */
+struct poller {
+ const struct poll_impl *impl;
+};
+
+/**
+ * Creates a poller with the best available polling backend. This poller must
+ * be torn down with poller_destroy when it is no longer needed.
+ */
+struct poller *poller_create(void);
+
+/**
+ * Destroys the poller. This destroys all remaining event sources, tears down
+ * the poller and frees the structure.
+ */
+int poller_destroy(struct poller *poller);
+
+/**
+ * Create an fd event source with the provided initial parameters. This event
+ * source must be torn down with event_source_fd_destroy when it is no longer
+ * needed.
+ */
+struct event_source_fd *poller_add_fd(struct poller *poller, int fd, uint32_t mask,
+ event_source_fd_func_t func, void *data);
+
+/**
+ * Create signal event source with the provided initial parameters. This event
+ * source must be torn down with event_source_signal_destroy when it is no
+ * longer needed.
+ */
+struct event_source_signal *poller_add_signal(struct poller *poller, int signal,
+ event_source_signal_func_t func, void *data);
+
+/**
+ * Poll the poller. I don't know what you were expecting.
+ */
+int poller_poll(struct poller *poller);
+
+#endif