]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/poll.c
io: don't do wakeup immediately.
[ccan] / ccan / io / poll.c
index 078de1403ff8a886db059f14b2437799bab7edf3..7af61d5a2699cac1f73aa7470da4da19c37efb9d 100644 (file)
@@ -78,6 +78,12 @@ static void del_fd(struct fd *fd)
        }
        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);
 }
 
@@ -152,11 +158,11 @@ void backend_wake(const void *wait)
                c = (void *)fds[i];
                if (c->plan[IO_IN].status == IO_WAITING
                    && c->plan[IO_IN].arg.u1.const_vp == wait)
-                       io_do_wakeup(c, &c->plan[IO_IN]);
+                       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, &c->plan[IO_OUT]);
+                       io_do_wakeup(c, IO_OUT);
        }
 }