X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=faf8b87bfd649b7244e8ee01087651d1039dbbf5;hp=a58b3f01a71f7526dba3f4e69fb987d8ebaea703;hb=95b59482c1bb18b7904ea60149eff4809dd28d80;hpb=f508ed408b230c21341778370ab04def8e7aba3a diff --git a/ccan/io/io.c b/ccan/io/io.c index a58b3f01..faf8b87b 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -435,6 +435,10 @@ void io_wake_(struct io_conn *conn, struct io_plan plan) void io_ready(struct io_conn *conn) { + /* Beware io_close_other! */ + if (!conn->plan.next) + return; + set_current(conn); switch (conn->plan.io(conn->fd.fd, &conn->plan)) { case -1: /* Failure means a new plan: close up. */ @@ -474,6 +478,12 @@ struct io_plan io_close_cb(struct io_conn *conn, void *arg) return io_close(); } +void io_close_other(struct io_conn *conn) +{ + conn->plan = io_close_(); + backend_plan_changed(conn); +} + /* Exit the loop, returning this (non-NULL) arg. */ struct io_plan io_break_(void *ret, struct io_plan plan) {