X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=faf8b87bfd649b7244e8ee01087651d1039dbbf5;hp=54ba7da529ec433661163f2d01fb4ab335562fa8;hb=95b59482c1bb18b7904ea60149eff4809dd28d80;hpb=02ae136a997a5e7cc3bb9210167a066b9f169a7b diff --git a/ccan/io/io.c b/ccan/io/io.c index 54ba7da5..faf8b87b 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -46,12 +46,6 @@ struct io_plan io_debug(struct io_plan plan) current->plan = plan; backend_plan_changed(current); - /* If it closed, close duplex. */ - if (!current->plan.next && current->duplex) { - current->duplex->plan = io_close_(); - backend_plan_changed(current->duplex); - } - /* Call back into the loop immediately. */ io_loop_return = do_io_loop(&ready); @@ -441,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. */ @@ -460,14 +458,6 @@ void io_ready(struct io_conn *conn) backend_plan_changed(conn); } set_current(NULL); - - /* If it closed, close duplex if not already */ - if (!conn->plan.next && conn->duplex && conn->duplex->plan.next) { - set_current(conn->duplex); - conn->duplex->plan = io_close(); - backend_plan_changed(conn->duplex); - set_current(NULL); - } } /* Close the connection, we're done. */ @@ -488,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) {