X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fio.c;h=83104f86b43ddfceed6d5bf7938a60d28ac159f2;hp=b74520444353761451529af0d0467522293f2686;hb=dded32f2b03fca526271e35671fa36d299880429;hpb=83d4e1285dec87fa54043377eafd1b3bf9b0c53f;ds=sidebyside diff --git a/ccan/io/io.c b/ccan/io/io.c index b7452044..83104f86 100644 --- a/ccan/io/io.c +++ b/ccan/io/io.c @@ -100,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: @@ -443,13 +447,17 @@ 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) { + /* 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);