aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorBrian Feldman <green@FreeBSD.org>2004-02-12 01:48:40 +0000
committerBrian Feldman <green@FreeBSD.org>2004-02-12 01:48:40 +0000
commitf662a93197cfcfdfb624d5b36250ee08afe262d4 (patch)
treead2204600e908ce422a2d3b72b6136f19690f5e1 /sys/kern/uipc_socket.c
parentc7a61a03e88429ad6929960e7a3793665d31d9fd (diff)
downloadsrc-f662a93197cfcfdfb624d5b36250ee08afe262d4.tar.gz
src-f662a93197cfcfdfb624d5b36250ee08afe262d4.zip
Always socantsendmore() before deallocating a socket. This, in turn,
calls selwakeup() if necessary (which it is, if you don't want freed memory hanging around on your td->td_selq). Props to: alfred
Notes
Notes: svn path=/head/; revision=125724
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index f06e48bf4a98..683bc0d1b3a7 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -291,6 +291,7 @@ sofree(so)
struct socket *so;
{
struct socket *head = so->so_head;
+ int s;
KASSERT(so->so_count == 0, ("socket %p so_count not 0", so));
@@ -314,6 +315,12 @@ sofree(so)
so->so_state &= ~SS_INCOMP;
so->so_head = NULL;
}
+ so->so_snd.sb_flags |= SB_NOINTR;
+ (void)sblock(&so->so_snd, M_WAITOK);
+ s = splimp();
+ socantsendmore(so);
+ splx(s);
+ sbunlock(&so->so_snd);
sbrelease(&so->so_snd, so);
sorflush(so);
sodealloc(so);