diff options
author | Brian Feldman <green@FreeBSD.org> | 2004-02-12 01:48:40 +0000 |
---|---|---|
committer | Brian Feldman <green@FreeBSD.org> | 2004-02-12 01:48:40 +0000 |
commit | f662a93197cfcfdfb624d5b36250ee08afe262d4 (patch) | |
tree | ad2204600e908ce422a2d3b72b6136f19690f5e1 /sys/kern/uipc_socket.c | |
parent | c7a61a03e88429ad6929960e7a3793665d31d9fd (diff) | |
download | src-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.c | 7 |
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); |