Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Apr 2013 15:06:30 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r250102 - head/sys/kern
Message-ID:  <201304301506.r3UF6UDa075891@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304301506.r3UF6UDa075891>