Otherwise, it's a PITA to close a duplexed connection. If necessary we
can introduce a half-close to de-deplex later.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
current->plan = plan;
backend_plan_changed(current);
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);
/* Call back into the loop immediately. */
io_loop_return = do_io_loop(&ready);
backend_plan_changed(conn);
}
set_current(NULL);
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. */
}
/* Close the connection, we're done. */
* to have two connections for the same fd, and use one for read
* operations and one for write.
*
* to have two connections for the same fd, and use one for read
* operations and one for write.
*
- * You must io_close() both of them to close the fd.
+ * Returning io_close() on one will close both fds!
*
* Example:
* static void setup_read_write(int fd,
*
* Example:
* static void setup_read_write(int fd,
static struct io_plan write_done(struct io_conn *conn, struct data *d)
{
d->state++;
static struct io_plan write_done(struct io_conn *conn, struct data *d)
{
d->state++;
}
static void init_conn(int fd, struct data *d)
}
static void init_conn(int fd, struct data *d)