summaryrefslogtreecommitdiffstats
path: root/src/io-unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/io-unix.c')
-rw-r--r--src/io-unix.c58
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;
}