X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=83104f86b43ddfceed6d5bf7938a60d28ac159f2;hb=dded32f2b03fca526271e35671fa36d299880429;hp=f45589c0fac71888b1be312debcb3ec04597b0bb;hpb=96a1ebd3354ef6250e94b509b4e0c0f1ea7e67bb;p=ccan diff --git a/ccan/io/io.c b/ccan/io/io.c index f45589c0..83104f86 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -46,6 +46,12 @@ 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); @@ -94,6 +100,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: @@ -437,10 +447,22 @@ 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 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. */