Commit d0458a43 authored by Rusty Russell's avatar Rusty Russell

ccan/io: simplify do_ready.

Have it set the plan itself, rather than passing it back.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent cef578da
...@@ -51,9 +51,9 @@ bool add_listener(struct io_listener *l); ...@@ -51,9 +51,9 @@ bool add_listener(struct io_listener *l);
bool add_conn(struct io_conn *c); bool add_conn(struct io_conn *c);
bool add_duplex(struct io_conn *c); bool add_duplex(struct io_conn *c);
void del_listener(struct io_listener *l); 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_add_timeout(struct io_conn *conn, struct timespec ts);
void backend_del_timeout(struct io_conn *conn); 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 */ #endif /* CCAN_IO_BACKEND_H */
...@@ -255,22 +255,17 @@ void io_wake(struct io_conn *conn, struct io_plan plan) ...@@ -255,22 +255,17 @@ void io_wake(struct io_conn *conn, struct io_plan plan)
/* It was idle, right? */ /* It was idle, right? */
assert(!conn->plan.io); assert(!conn->plan.io);
conn->plan = plan; 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)) if (conn->plan.io(conn->fd.fd, &conn->plan)) {
backend_del_timeout(conn); if (timeout_active(conn))
return conn->plan.next(conn, conn->plan.next_arg); backend_del_timeout(conn);
} conn->plan = conn->plan.next(conn, conn->plan.next_arg);
backend_plan_changed(conn);
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;
} }
/* Useful next functions. */ /* Useful next functions. */
......
...@@ -77,7 +77,7 @@ bool add_listener(struct io_listener *l) ...@@ -77,7 +77,7 @@ bool add_listener(struct io_listener *l)
return true; 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]; struct pollfd *pfd = &pollfds[conn->fd.backend_info];
...@@ -111,7 +111,7 @@ bool add_conn(struct io_conn *c) ...@@ -111,7 +111,7 @@ bool add_conn(struct io_conn *c)
bool add_duplex(struct io_conn *c) bool add_duplex(struct io_conn *c)
{ {
c->fd.backend_info = c->duplex->fd.backend_info; c->fd.backend_info = c->duplex->fd.backend_info;
update_pollevents(c); backend_plan_changed(c);
return true; return true;
} }
...@@ -136,15 +136,10 @@ void del_listener(struct io_listener *l) ...@@ -136,15 +136,10 @@ void del_listener(struct io_listener *l)
del_fd(&l->fd); 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; conn->plan = plan;
update_pollevents(conn); backend_plan_changed(conn);
}
void backend_wakeup(struct io_conn *conn)
{
update_pollevents(conn);
} }
static void accept_conn(struct io_listener *l) static void accept_conn(struct io_listener *l)
...@@ -181,11 +176,6 @@ static void finish_conns(void) ...@@ -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) void backend_add_timeout(struct io_conn *conn, struct timespec duration)
{ {
if (!timeouts.base) if (!timeouts.base)
...@@ -224,7 +214,7 @@ void *io_loop(void) ...@@ -224,7 +214,7 @@ void *io_loop(void)
struct io_conn *conn = t->conn; struct io_conn *conn = t->conn;
/* Clear, in case timer re-adds */ /* Clear, in case timer re-adds */
t->conn = NULL; 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. */ /* Now figure out how long to wait for the next one. */
...@@ -268,20 +258,19 @@ void *io_loop(void) ...@@ -268,20 +258,19 @@ void *io_loop(void)
if (c->duplex) { if (c->duplex) {
int mask = c->duplex->plan.pollflag; int mask = c->duplex->plan.pollflag;
if (events & mask) { if (events & mask) {
ready(c->duplex); io_ready(c->duplex);
events &= ~mask; events &= ~mask;
if (!(events&(POLLIN|POLLOUT))) if (!(events&(POLLIN|POLLOUT)))
continue; continue;
} }
} }
ready(c); io_ready(c);
} else if (events & POLLHUP) { } else if (events & POLLHUP) {
r--; r--;
backend_set_state(c, io_close(c, NULL)); set_plan(c, io_close(c, NULL));
if (c->duplex) if (c->duplex)
backend_set_state(c->duplex, set_plan(c->duplex,
io_close(c->duplex, io_close(c->duplex, NULL));
NULL));
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment