}
num_fds--;
fd->backend_info = -1;
+
+ /* Closing a local socket doesn't wake poll() because other end
+ * has them open. See 2.6. When should I use shutdown()?
+ * in http://www.faqs.org/faqs/unix-faq/socket/ */
+ shutdown(fd->fd, SHUT_RDWR);
+
close(fd->fd);
}
return true;
}
-void backend_new_closing(struct io_conn *conn)
+void remove_from_always(struct io_conn *conn)
{
- /* Already on always list? Remove it. */
- if (conn->list) {
- struct io_conn **p = &always;
+ struct io_conn **p = &always;
- while (*p != conn)
- p = &(*p)->list;
+ while (*p != conn)
+ p = &(*p)->list;
- *p = conn->list;
- }
+ *p = conn->list;
+}
+
+void backend_new_closing(struct io_conn *conn)
+{
+ /* Already on always list? Remove it. */
+ if (conn->list)
+ remove_from_always(conn);
conn->list = closing;
closing = conn;
c = (void *)fds[i];
if (c->plan[IO_IN].status == IO_WAITING
- && c->plan[IO_IN].u1.const_vp == wait)
- io_do_wakeup(c, &c->plan[IO_IN]);
+ && 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].u1.const_vp == wait)
- io_do_wakeup(c, &c->plan[IO_OUT]);
+ && c->plan[IO_OUT].arg.u1.const_vp == wait)
+ io_do_wakeup(c, IO_OUT);
}
}
del_fd(&conn->fd);
if (conn->finish) {
/* Saved by io_close */
- errno = conn->plan[IO_IN].u1.s;
+ errno = conn->plan[IO_IN].arg.u1.s;
conn->finish(conn, conn->finish_arg);
}
tal_free(conn);