Author: jtl
Date: Thu Oct 18 14:20:15 2018
New Revision: 339419
URL: https://svnweb.freebsd.org/changeset/base/339419

Log:
  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

Modified:
  head/share/man/man9/socket.9
  head/sys/kern/uipc_socket.c

Modified: head/share/man/man9/socket.9
==============================================================================
--- head/share/man/man9/socket.9        Thu Oct 18 04:36:25 2018        
(r339418)
+++ head/share/man/man9/socket.9        Thu Oct 18 14:20:15 2018        
(r339419)
@@ -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

Modified: head/sys/kern/uipc_socket.c
==============================================================================
--- head/sys/kern/uipc_socket.c Thu Oct 18 04:36:25 2018        (r339418)
+++ head/sys/kern/uipc_socket.c Thu Oct 18 14:20:15 2018        (r339419)
@@ -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))) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to