From: Rusty Russell Date: Mon, 14 Oct 2013 10:58:36 +0000 (+1030) Subject: ccan/io: simplify do_ready. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=d0458a433876acc01b48f74c1c3b966bbc29de57 ccan/io: simplify do_ready. Have it set the plan itself, rather than passing it back. Signed-off-by: Rusty Russell --- diff --git a/ccan/io/backend.h b/ccan/io/backend.h index e65c9906..48e160da 100644 --- a/ccan/io/backend.h +++ b/ccan/io/backend.h @@ -51,9 +51,9 @@ bool add_listener(struct io_listener *l); 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 */ diff --git a/ccan/io/io.c b/ccan/io/io.c index c19b25ef..8d439223 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -255,22 +255,17 @@ void io_wake(struct io_conn *conn, struct io_plan plan) /* 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. */ diff --git a/ccan/io/poll.c b/ccan/io/poll.c index 46b2334e..9f9bb4a2 100644 --- a/ccan/io/poll.c +++ b/ccan/io/poll.c @@ -77,7 +77,7 @@ bool add_listener(struct io_listener *l) 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]; @@ -111,7 +111,7 @@ bool add_conn(struct io_conn *c) 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; } @@ -136,15 +136,10 @@ void del_listener(struct io_listener *l) 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) @@ -181,11 +176,6 @@ static void finish_conns(void) } } -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) @@ -224,7 +214,7 @@ void *io_loop(void) 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. */ @@ -268,20 +258,19 @@ void *io_loop(void) 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)); } } }