Author: jilles
Date: Tue Apr 30 15:06:30 2013
New Revision: 250102
URL: http://svnweb.freebsd.org/changeset/base/250102

Log:
  socket: Make shutdown() wake up a blocked accept().
  
  A blocking accept (and some other operations) waits on &so->so_timeo. Once
  it wakes up, it will detect the SBS_CANTRCVMORE bit.
  
  The error from accept() is [ECONNABORTED] which is not the nicest one -- the
  thread calling accept() needs to know out-of-band what is happening.
  
  A spurious wakeup on so->so_timeo appears harmless (sleep retried) except
  when lingering on close (SO_LINGER, and in that case there is no descriptor
  to call shutdown() on) so this should be fairly safe.
  
  A shutdown() already woke up a blocked accept() for TCP sockets, but not for
  Unix domain sockets. This fix is generic for all domains.
  
  This patch was sent to -hackers@ and -net@ on April 5.
  
  MFC after:    2 weeks

Modified:
  head/sys/kern/uipc_socket.c

Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c Tue Apr 30 14:56:41 2013        (r250101)
+++ head/sys/kern/uipc_socket.c Tue Apr 30 15:06:30 2013        (r250102)
@@ -2429,9 +2429,11 @@ soshutdown(struct socket *so, int how)
                sorflush(so);
        if (how != SHUT_RD) {
                error = (*pr->pr_usrreqs->pru_shutdown)(so);
+               wakeup(&so->so_timeo);
                CURVNET_RESTORE();
                return (error);
        }
+       wakeup(&so->so_timeo);
        CURVNET_RESTORE();
        return (0);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to