+int event_register(void *data)
+{
+ int fds[2];
+ if (pipe(fds) != 0) {
+ UNIXERR("pipe");
+ return -1;
+ }
+ if (setnonblock(fds[0]) != 0) {
+ close(fds[0]);
+ close(fds[1]);
+ return -1;
+ }
+
+ server_t *tmp = server_acquire();
+ tmp->event = true;
+ tmp->fd = fds[0];
+ tmp->fd2 = fds[1];
+ tmp->data = data;
+ epoll_register(fds[0], EPOLLIN, tmp);
+ return tmp->fd2;
+}
+
+bool event_fire(int event)
+{
+ static const char *data = "";
+ return write(event, data, 1) == 0;
+}
+
+static bool event_cancel(int event)
+{
+ static char buff[1];
+ while (true) {
+ ssize_t res = read(event, buff, 64);
+ if (res == -1 && errno != EAGAIN && errno != EINTR) {
+ UNIXERR("read");
+ return false;
+ } else if (res == -1 && errno == EINTR) {
+ continue;
+ } else if (res != 1) {
+ return true;
+ }
+ }
+}
+