r334853 added a "socket destructor" callback. However, as implemented, it

was really a "socket close" callback.

Update the socket destructor functionality to run when a socket is
destroyed (rather than when it is closed). The original submitter has
confirmed that this change satisfies the intended use case.

Suggested by:	rwatson
Submitted by:	Michio Honda <micchie at sfc.wide.ad.jp>
Tested by:	Michio Honda <micchie at sfc.wide.ad.jp>
Approved by:	re (kib)
Differential Revision:	https://reviews.freebsd.org/D17590
This commit is contained in:
Jonathan T. Looney 2018-10-18 14:20:15 +00:00
parent c35b07d1cb
commit e77f0bdcb5
2 changed files with 6 additions and 5 deletions

View File

@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd June 8, 2018
.Dd October 18, 2018
.Dt SOCKET 9
.Os
.Sh NAME
@ -378,8 +378,8 @@ or
A kernel system can use the
.Fn sodtor_set
function to set a destructor for a socket.
The destructor is called when the socket is closed.
The destructor is called after the protocol close routine has completed.
The destructor is called when the socket is is about to be freed.
The destructor is called before the protocol detach routine.
The destructor can serve as a callback to initiate additional cleanup actions.
.Ss Socket I/O
The

View File

@ -1026,6 +1026,9 @@ sofree(struct socket *so)
so->so_error = ECONNABORTED;
SOCK_UNLOCK(so);
if (so->so_dtor != NULL)
so->so_dtor(so);
VNET_SO_ASSERT(so);
if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose != NULL)
(*pr->pr_domain->dom_dispose)(so);
@ -1102,8 +1105,6 @@ soclose(struct socket *so)
drop:
if (so->so_proto->pr_usrreqs->pru_close != NULL)
(*so->so_proto->pr_usrreqs->pru_close)(so);
if (so->so_dtor != NULL)
so->so_dtor(so);
SOCK_LOCK(so);
if ((listening = (so->so_options & SO_ACCEPTCONN))) {