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);
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. */
* to have two connections for the same fd, and use one for read
* operations and one for write.
*
- * Returning io_close() on one will close both fds!
+ * You must io_close() both of them to close the fd.
*
* Example:
* static void setup_read_write(int fd,
static struct io_plan end(struct io_conn *conn, struct data *d)
{
d->state++;
-
- /* last one out closes. */
- if (conn == d->c1 && io_is_idle(d->c2))
- return io_close();
-
- /* last one out closes. */
- if (conn == d->c2 && io_is_idle(d->c1))
- return io_close();
-
- return io_idle();
+ return io_close();
}
static struct io_plan make_duplex(struct io_conn *conn, struct data *d)