unsigned int magic; /*%< Magic number. */
ns_interfacemgr_t *mgr; /*%< Interface manager. */
isc_mutex_t lock;
- isc_refcount_t references;
unsigned int generation; /*%< Generation number. */
isc_sockaddr_t addr; /*%< Address and port. */
unsigned int flags; /*%< Interface flags */
dns_aclenv_t *
ns_interfacemgr_getaclenv(ns_interfacemgr_t *mgr);
-void
-ns_interface_attach(ns_interface_t *source, ns_interface_t **target);
-
-void
-ns_interface_detach(ns_interface_t **targetp);
-
void
ns_interface_shutdown(ns_interface_t *ifp);
/*%<
ISC_LIST_APPEND(mgr->interfaces, ifp, link);
UNLOCK(&mgr->lock);
- isc_refcount_init(&ifp->references, 1);
ifp->magic = IFACE_MAGIC;
*ifpret = ifp;
}
static void
-interface_destroy(ns_interface_t *ifp) {
- ns_interfacemgr_t *mgr;
+interface_destroy(ns_interface_t **interfacep) {
+ ns_interface_t *ifp = NULL;
+ ns_interfacemgr_t *mgr = NULL;
+
+ REQUIRE(interfacep != NULL);
+
+ ifp = *interfacep;
+ *interfacep = NULL;
REQUIRE(NS_INTERFACE_VALID(ifp));
isc_mem_put(mgr->mctx, ifp, sizeof(*ifp));
}
-void
-ns_interface_attach(ns_interface_t *source, ns_interface_t **target) {
- REQUIRE(NS_INTERFACE_VALID(source));
- isc_refcount_increment(&source->references);
- *target = source;
-}
-
-void
-ns_interface_detach(ns_interface_t **targetp) {
- ns_interface_t *target = *targetp;
- *targetp = NULL;
- REQUIRE(target != NULL);
- REQUIRE(NS_INTERFACE_VALID(target));
- if (isc_refcount_decrement(&target->references) == 1) {
- interface_destroy(target);
- }
-}
-
/*%
* Search the interface list for an interface whose address and port
* both match those of 'addr'. Return a pointer to it, or NULL if not found.
"no longer listening on %s", sabuf);
ns_interface_shutdown(ifp);
}
- ns_interface_detach(&ifp);
+ interface_destroy(&ifp);
}
}
UNLOCK(&mgr->lock);
le->sslctx != NULL) {
INSIST(NS_INTERFACE_VALID(ifp));
LOCK(&mgr->lock);
- ISC_LIST_UNLINK(ifp->mgr->interfaces,
- ifp, link);
isc_sockaddr_format(&ifp->addr, sabuf,
sizeof(sabuf));
isc_log_write(IFMGR_COMMON_LOGARGS,
"no longer listening on "
"%s",
sabuf);
- ns_interface_shutdown(ifp);
- ns_interface_detach(&ifp);
+ interface_destroy(&ifp);
UNLOCK(&mgr->lock);
} else {
ifp->generation = mgr->generation;
le->sslctx != NULL) {
INSIST(NS_INTERFACE_VALID(ifp));
LOCK(&mgr->lock);
- ISC_LIST_UNLINK(ifp->mgr->interfaces,
- ifp, link);
isc_sockaddr_format(&ifp->addr, sabuf,
sizeof(sabuf));
isc_log_write(IFMGR_COMMON_LOGARGS,
"no longer listening on "
"%s",
sabuf);
- ns_interface_shutdown(ifp);
- ns_interface_detach(&ifp);
+ interface_destroy(&ifp);
UNLOCK(&mgr->lock);
} else {
ifp->generation = mgr->generation;