diff options
Diffstat (limited to 'src/io-unix.c')
-rw-r--r-- | src/io-unix.c | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/src/io-unix.c b/src/io-unix.c index 39cdf64..d80592a 100644 --- a/src/io-unix.c +++ b/src/io-unix.c @@ -10,8 +10,18 @@ * See http://www.gnu.org/ for details. */ +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/socket.h> #include <string.h> +#include <libtf/io.h> +#include <libtf/scheduler.h> + +#define TF_POLL_HOOKS \ +struct tf_poll_hooks *poller = tf_scheduler_get_current()->poller; + static inline int tf_sockaddr_len(const struct tf_sockaddr *addr) { if (addr == NULL) @@ -28,13 +38,14 @@ static inline int tf_sockaddr_len(const struct tf_sockaddr *addr) int tf_open_fd(struct tf_fd *fd, int kfd, int flags) { + TF_POLL_HOOKS; int r; fd->fd = kfd; fd->flags = flags; fd->waiting_fiber = NULL; - r = tf_fd_created(fd); + r = poller->fd_created(fd); if (r < 0) { if (flags & TF_FD_AUTOCLOSE) close(kfd); @@ -77,9 +88,10 @@ int tf_open(struct tf_fd *fd, const char *pathname, int flags) int tf_close(struct tf_fd *fd) { + TF_POLL_HOOKS; int r; - tf_fd_destroyed(fd); + poller->fd_destroyed(fd); if (fd->flags & TF_FD_AUTOCLOSE) { r = close(fd->fd); if (unlikely(r == -1)) @@ -92,10 +104,11 @@ int tf_close(struct tf_fd *fd) int tf_read_fully(struct tf_fd *fd, void *buf, size_t count) { + TF_POLL_HOOKS; ssize_t n; int r; - tf_fd_monitor(fd, EPOLLIN); + poller->fd_monitor(fd, TF_POLL_READ); do { n = read(fd->fd, buf, count); if (n == count) { @@ -121,17 +134,18 @@ int tf_read_fully(struct tf_fd *fd, void *buf, size_t count) r = __tf_fiber_schedule(); } while (r == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); return -r; } int tf_write_fully(struct tf_fd *fd, const void *buf, size_t count) { + TF_POLL_HOOKS; ssize_t n; int r; - tf_fd_monitor(fd, EPOLLOUT); + poller->fd_monitor(fd, TF_POLL_WRITE); do { n = write(fd->fd, buf, count); if (n == count) { @@ -154,16 +168,17 @@ int tf_write_fully(struct tf_fd *fd, const void *buf, size_t count) r = __tf_fiber_schedule(); } while (r == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); return -r; } ssize_t tf_read(struct tf_fd *fd, void *buf, size_t count) { + TF_POLL_HOOKS; ssize_t n; - tf_fd_monitor(fd, EPOLLIN); + poller->fd_monitor(fd, TF_POLL_READ); do { n = read(fd->fd, buf, count); if (n >= 0) @@ -176,16 +191,17 @@ ssize_t tf_read(struct tf_fd *fd, void *buf, size_t count) } n = __tf_fiber_schedule(); } while (n == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); return n; } ssize_t tf_write(struct tf_fd *fd, const void *buf, size_t count) { + TF_POLL_HOOKS; ssize_t n; - tf_fd_monitor(fd, EPOLLOUT); + poller->fd_monitor(fd, TF_POLL_WRITE); do { n = write(fd->fd, buf, count); if (n >= 0) @@ -198,7 +214,7 @@ ssize_t tf_write(struct tf_fd *fd, const void *buf, size_t count) } n = __tf_fiber_schedule(); } while (n == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); return n; } @@ -245,6 +261,7 @@ int tf_listen(struct tf_fd *fd, int backlog) int tf_accept(struct tf_fd *listen_fd, struct tf_fd *child_fd, struct tf_sockaddr *from) { + TF_POLL_HOOKS; int r, tfdf; struct sockaddr *addr = NULL; socklen_t al, *pal = NULL; @@ -258,7 +275,7 @@ int tf_accept(struct tf_fd *listen_fd, struct tf_fd *child_fd, tfdf = TF_FD_AUTOCLOSE | (listen_fd->flags & TF_FD_STREAM_ORIENTED); tfdf |= TF_FD_SET_CLOEXEC; - tf_fd_monitor(listen_fd, EPOLLIN); + poller->fd_monitor(listen_fd, TF_POLL_READ); do { /* FIXME: use accept4 if available */ r = accept(listen_fd->fd, addr, pal); @@ -267,12 +284,12 @@ int tf_accept(struct tf_fd *listen_fd, struct tf_fd *child_fd, if (errno == EINTR) continue; if (errno != EAGAIN) { - tf_fd_unmonitor(listen_fd); + poller->fd_unmonitor(listen_fd); return -errno; } r = __tf_fiber_schedule(); } while (r == TF_WAKEUP_FD); - tf_fd_unmonitor(listen_fd); + poller->fd_unmonitor(listen_fd); if (r < 0) return r; @@ -281,6 +298,7 @@ int tf_accept(struct tf_fd *listen_fd, struct tf_fd *child_fd, int tf_connect(struct tf_fd *fd, const struct tf_sockaddr *to) { + TF_POLL_HOOKS; socklen_t l = sizeof(int); int r, err; @@ -292,9 +310,9 @@ int tf_connect(struct tf_fd *fd, const struct tf_sockaddr *to) return -errno; /* Wait for socket to become readable */ - tf_fd_monitor(fd, EPOLLOUT); + poller->fd_monitor(fd, TF_POLL_WRITE); r = __tf_fiber_schedule(); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); if (r != TF_WAKEUP_FD) return r; @@ -309,6 +327,7 @@ ssize_t tf_recvmsg(struct tf_fd *fd, struct tf_sockaddr *to, void *buf, size_t len) { + TF_POLL_HOOKS; struct iovec iov; struct msghdr msg; struct cmsghdr *cmsg; @@ -328,7 +347,7 @@ ssize_t tf_recvmsg(struct tf_fd *fd, .msg_iovlen = 1, }; - tf_fd_monitor(fd, EPOLLIN); + poller->fd_monitor(fd, TF_POLL_READ); do { r = recvmsg(fd->fd, &msg, 0); if (r >= 0) @@ -339,7 +358,7 @@ ssize_t tf_recvmsg(struct tf_fd *fd, } r = __tf_fiber_schedule(); } while (r == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); if (r < 0 || to == NULL) return r; @@ -363,6 +382,7 @@ ssize_t tf_sendmsg(struct tf_fd *fd, const struct tf_sockaddr *to, const void *buf, size_t len) { + TF_POLL_HOOKS; struct msghdr msg; struct iovec iov; struct { @@ -391,7 +411,7 @@ ssize_t tf_sendmsg(struct tf_fd *fd, msg.msg_controllen = sizeof(cmsg); } - tf_fd_monitor(fd, EPOLLOUT); + poller->fd_monitor(fd, TF_POLL_WRITE); do { r = sendmsg(fd->fd, &msg, 0); if (r >= 0) @@ -402,7 +422,7 @@ ssize_t tf_sendmsg(struct tf_fd *fd, } r = __tf_fiber_schedule(); } while (r == TF_WAKEUP_FD); - tf_fd_unmonitor(fd); + poller->fd_unmonitor(fd); return r; } |