- for (duplex = c->duplex; c; c = duplex, duplex = NULL) {
- if (c->state == FINISHED) {
- del_conn(c);
- free(c);
- i--;
- } else if (!finished_only && c->state == NEXT) {
- backend_set_state(c, c->next(c, c->next_arg));
- num_next--;
- }
- }
+ if (c->plan[IO_IN].status == IO_WAITING
+ && c->plan[IO_IN].arg.u1.const_vp == wait)
+ io_do_wakeup(c, IO_IN);
+
+ if (c->plan[IO_OUT].status == IO_WAITING
+ && c->plan[IO_OUT].arg.u1.const_vp == wait)
+ io_do_wakeup(c, IO_OUT);
+ }
+}
+
+static void destroy_conn(struct io_conn *conn, bool close_fd)
+{
+ int saved_errno = errno;
+
+ if (close_fd)
+ close(conn->fd.fd);
+ del_fd(&conn->fd);
+ /* In case it's on always list, remove it. */
+ list_del_init(&conn->always);
+
+ /* errno saved/restored by tal_free itself. */
+ if (conn->finish) {
+ errno = saved_errno;
+ conn->finish(conn, conn->finish_arg);