summaryrefslogtreecommitdiff
path: root/nio.h
diff options
context:
space:
mode:
Diffstat (limited to 'nio.h')
-rw-r--r--nio.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/nio.h b/nio.h
new file mode 100644
index 000000000..60e1b0926
--- /dev/null
+++ b/nio.h
@@ -0,0 +1,95 @@
+#ifndef NIO_H
+#define NIO_H 1
+
+#include <poll.h>
+
+#define WARN_UNUSED __attribute__((__warn_unused_result__))
+
+enum
+{
+ NIO_SUCCESS = 0,
+ NIO_ERROR_INTERNAL = 1,
+ NIO_ERROR_SYSTEM = -1
+};
+
+enum
+{
+ NIO_EVENT_INVALID = 0,
+ NIO_EVENT_INPUT = 1,
+ NIO_EVENT_OUTPUT = 2,
+ NIO_EVENT_ERROR = 4,
+};
+
+struct nio
+{
+ int nready;
+
+ nfds_t poll_max_fds;
+ struct pollfd * poll_fds;
+ void ** poll_ptrs;
+ nfds_t * poll_fds_set;
+
+ int epoll_fd;
+ int max_events;
+ void * events;
+};
+
+void nio_init(struct nio * io);
+
+WARN_UNUSED
+int nio_use_poll(struct nio * io, nfds_t max_fds);
+
+WARN_UNUSED
+int nio_use_epoll(struct nio * io, int max_events);
+
+WARN_UNUSED
+int nio_add_fd(struct nio * io, int fd, int event_flags, void * ptr);
+
+WARN_UNUSED
+int nio_mod_fd(struct nio * io, int fd, int event_flags, void * ptr);
+
+WARN_UNUSED
+int nio_del_fd(struct nio * io, int fd);
+
+WARN_UNUSED
+int nio_run(struct nio * io, int timeout);
+
+WARN_UNUSED
+static inline int nio_get_nready(struct nio const * const io)
+{
+ return io->nready;
+}
+
+WARN_UNUSED
+int nio_check(struct nio * io, int index, int events);
+
+WARN_UNUSED
+int nio_is_valid(struct nio const * const io, int index);
+
+WARN_UNUSED
+int nio_get_fd(struct nio * io, int index);
+
+WARN_UNUSED
+void * nio_get_ptr(struct nio * io, int index);
+
+WARN_UNUSED
+static inline int nio_has_input(struct nio * io, int index)
+{
+ return nio_check(io, index, NIO_EVENT_INPUT);
+}
+
+WARN_UNUSED
+static inline int nio_can_output(struct nio * io, int index)
+{
+ return nio_check(io, index, NIO_EVENT_OUTPUT);
+}
+
+WARN_UNUSED
+static inline int nio_has_error(struct nio * io, int index)
+{
+ return nio_check(io, index, NIO_EVENT_ERROR);
+}
+
+void nio_free(struct nio * io);
+
+#endif