X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=a58b3f01a71f7526dba3f4e69fb987d8ebaea703;hp=b74520444353761451529af0d0467522293f2686;hb=5a510ed5696255910fd42adb47d7c1ffa728a116;hpb=490b63852f281f0d72eb6f6dfa5e0dce36bcbe0d diff --git a/ccan/io/io.c b/ccan/io/io.c index b7452044..a58b3f01 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); @@ -100,6 +94,10 @@ int io_debug_io(int ret) case 1: /* Done: get next plan. */ if (timeout_active(conn)) backend_del_timeout(conn); + /* In case they call io_duplex, clear our poll flags so + * both sides don't seem to be both doing read or write + * (See assert(!mask || pfd->events != mask) in poll.c) */ + conn->plan.pollflag = 0; conn->plan.next(conn, conn->plan.next_arg); break; default: @@ -414,6 +412,11 @@ struct io_plan io_idle_(void) return plan; } +bool io_is_idle(const struct io_conn *conn) +{ + return conn->plan.io == NULL; +} + void io_wake_(struct io_conn *conn, struct io_plan plan) { @@ -443,18 +446,14 @@ void io_ready(struct io_conn *conn) case 1: /* Done: get next plan. */ if (timeout_active(conn)) backend_del_timeout(conn); + /* In case they call io_duplex, clear our poll flags so + * both sides don't seem to be both doing read or write + * (See assert(!mask || pfd->events != mask) in poll.c) */ + conn->plan.pollflag = 0; conn->plan = conn->plan.next(conn, conn->plan.next_arg); backend_plan_changed(conn); } set_current(NULL); - - /* If it closed, close duplex. */ - if (!conn->plan.next && conn->duplex) { - set_current(conn->duplex); - conn->duplex->plan = io_close(); - backend_plan_changed(conn->duplex); - set_current(NULL); - } } /* Close the connection, we're done. */