bool add_conn(struct io_conn *c);
bool add_duplex(struct io_conn *c);
void del_listener(struct io_listener *l);
-void backend_wakeup(struct io_conn *conn);
+void backend_plan_changed(struct io_conn *conn);
void backend_add_timeout(struct io_conn *conn, struct timespec ts);
void backend_del_timeout(struct io_conn *conn);
-struct io_plan do_ready(struct io_conn *conn);
+void io_ready(struct io_conn *conn);
#endif /* CCAN_IO_BACKEND_H */
/* It was idle, right? */
assert(!conn->plan.io);
conn->plan = plan;
- backend_wakeup(conn);
+ backend_plan_changed(conn);
}
-static struct io_plan do_next(struct io_conn *conn)
+void io_ready(struct io_conn *conn)
{
- if (timeout_active(conn))
- backend_del_timeout(conn);
- return conn->plan.next(conn, conn->plan.next_arg);
-}
-
-struct io_plan do_ready(struct io_conn *conn)
-{
- if (conn->plan.io(conn->fd.fd, &conn->plan))
- return do_next(conn);
-
- return conn->plan;
+ if (conn->plan.io(conn->fd.fd, &conn->plan)) {
+ if (timeout_active(conn))
+ backend_del_timeout(conn);
+ conn->plan = conn->plan.next(conn, conn->plan.next_arg);
+ backend_plan_changed(conn);
+ }
}
/* Useful next functions. */
return true;
}
-static void update_pollevents(struct io_conn *conn)
+void backend_plan_changed(struct io_conn *conn)
{
struct pollfd *pfd = &pollfds[conn->fd.backend_info];
bool add_duplex(struct io_conn *c)
{
c->fd.backend_info = c->duplex->fd.backend_info;
- update_pollevents(c);
+ backend_plan_changed(c);
return true;
}
del_fd(&l->fd);
}
-static void backend_set_state(struct io_conn *conn, struct io_plan plan)
+static void set_plan(struct io_conn *conn, struct io_plan plan)
{
conn->plan = plan;
- update_pollevents(conn);
-}
-
-void backend_wakeup(struct io_conn *conn)
-{
- update_pollevents(conn);
+ backend_plan_changed(conn);
}
static void accept_conn(struct io_listener *l)
}
}
-static void ready(struct io_conn *c)
-{
- backend_set_state(c, do_ready(c));
-}
-
void backend_add_timeout(struct io_conn *conn, struct timespec duration)
{
if (!timeouts.base)
struct io_conn *conn = t->conn;
/* Clear, in case timer re-adds */
t->conn = NULL;
- backend_set_state(conn, t->next(conn, t->next_arg));
+ set_plan(conn, t->next(conn, t->next_arg));
}
/* Now figure out how long to wait for the next one. */
if (c->duplex) {
int mask = c->duplex->plan.pollflag;
if (events & mask) {
- ready(c->duplex);
+ io_ready(c->duplex);
events &= ~mask;
if (!(events&(POLLIN|POLLOUT)))
continue;
}
}
- ready(c);
+ io_ready(c);
} else if (events & POLLHUP) {
r--;
- backend_set_state(c, io_close(c, NULL));
+ set_plan(c, io_close(c, NULL));
if (c->duplex)
- backend_set_state(c->duplex,
- io_close(c->duplex,
- NULL));
+ set_plan(c->duplex,
+ io_close(c->duplex, NULL));
}
}
}