mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-22 10:10:06 +00:00
Use regular reference counting macro for isc_nm_t structure
Instead of having hand crafted attach/detach/destroy functions, replace them with the standard ISC_REFCOUNT macro. This also have advantage that delayed netmgr detach (from dns_dispatch) now doesn't cause assertion failure. This can happen with delayed (call_rcu) shutdown of dns_adb.
This commit is contained in:
parent
51d7efbfb4
commit
cca4b26d31
@ -123,16 +123,17 @@ isc_netmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr, isc_nm_t **netgmrp);
|
|||||||
* Creates a new network manager and starts it running when loopmgr is started.
|
* Creates a new network manager and starts it running when loopmgr is started.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
#if ISC_NETMGR_TRACE
|
||||||
isc_netmgr_destroy(isc_nm_t **netmgrp);
|
#define isc_nm_ref(ptr) isc_nm__ref(ptr, __func__, __FILE__, __LINE__)
|
||||||
/*%<
|
#define isc_nm_unref(ptr) isc_nm__unref(ptr, __func__, __FILE__, __LINE__)
|
||||||
* Similar to isc_nm_detach(), but requires all other references to be gone.
|
#define isc_nm_attach(ptr, ptrp) \
|
||||||
*/
|
isc_nm__attach(ptr, ptrp, __func__, __FILE__, __LINE__)
|
||||||
|
#define isc_nm_detach(ptrp) isc_nm__detach(ptrp, __func__, __FILE__, __LINE__)
|
||||||
|
ISC_REFCOUNT_TRACE_DECL(isc_nm);
|
||||||
|
#else
|
||||||
|
ISC_REFCOUNT_DECL(isc_nm);
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
|
||||||
isc_nm_attach(isc_nm_t *mgr, isc_nm_t **dst);
|
|
||||||
void
|
|
||||||
isc_nm_detach(isc_nm_t **mgr0);
|
|
||||||
/*%<
|
/*%<
|
||||||
* Attach/detach a network manager. When all references have been
|
* Attach/detach a network manager. When all references have been
|
||||||
* released, the network manager is shut down, freeing all resources.
|
* released, the network manager is shut down, freeing all resources.
|
||||||
|
@ -45,7 +45,7 @@ isc_managers_destroy(isc_mem_t **mctxp, isc_loopmgr_t **loopmgrp,
|
|||||||
* The sequence of operations here is important:
|
* The sequence of operations here is important:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
isc_netmgr_destroy(netmgrp);
|
isc_nm_detach(netmgrp);
|
||||||
isc_loopmgr_destroy(loopmgrp);
|
isc_loopmgr_destroy(loopmgrp);
|
||||||
isc_mem_detach(mctxp);
|
isc_mem_detach(mctxp);
|
||||||
}
|
}
|
||||||
|
@ -244,62 +244,27 @@ isc_netmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr, isc_nm_t **netmgrp) {
|
|||||||
* Free the resources of the network manager.
|
* Free the resources of the network manager.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
nm_destroy(isc_nm_t **mgr0) {
|
nm_destroy(isc_nm_t *netmgr) {
|
||||||
REQUIRE(VALID_NM(*mgr0));
|
REQUIRE(VALID_NM(netmgr));
|
||||||
|
|
||||||
isc_nm_t *mgr = *mgr0;
|
isc_refcount_destroy(&netmgr->references);
|
||||||
*mgr0 = NULL;
|
|
||||||
|
|
||||||
isc_refcount_destroy(&mgr->references);
|
netmgr->magic = 0;
|
||||||
|
|
||||||
mgr->magic = 0;
|
if (netmgr->stats != NULL) {
|
||||||
|
isc_stats_detach(&netmgr->stats);
|
||||||
if (mgr->stats != NULL) {
|
|
||||||
isc_stats_detach(&mgr->stats);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isc_mem_cput(mgr->mctx, mgr->workers, mgr->nloops,
|
isc_mem_cput(netmgr->mctx, netmgr->workers, netmgr->nloops,
|
||||||
sizeof(mgr->workers[0]));
|
sizeof(netmgr->workers[0]));
|
||||||
isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
|
isc_mem_putanddetach(&netmgr->mctx, netmgr, sizeof(*netmgr));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
#if ISC_NETMGR_TRACE
|
||||||
isc_nm_attach(isc_nm_t *mgr, isc_nm_t **dst) {
|
ISC_REFCOUNT_TRACE_IMPL(isc_nm, nm_destroy)
|
||||||
REQUIRE(VALID_NM(mgr));
|
#else
|
||||||
REQUIRE(dst != NULL && *dst == NULL);
|
ISC_REFCOUNT_IMPL(isc_nm, nm_destroy);
|
||||||
|
#endif
|
||||||
isc_refcount_increment(&mgr->references);
|
|
||||||
|
|
||||||
*dst = mgr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
isc_nm_detach(isc_nm_t **mgr0) {
|
|
||||||
isc_nm_t *mgr = NULL;
|
|
||||||
|
|
||||||
REQUIRE(mgr0 != NULL);
|
|
||||||
REQUIRE(VALID_NM(*mgr0));
|
|
||||||
|
|
||||||
mgr = *mgr0;
|
|
||||||
*mgr0 = NULL;
|
|
||||||
|
|
||||||
if (isc_refcount_decrement(&mgr->references) == 1) {
|
|
||||||
nm_destroy(&mgr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
isc_netmgr_destroy(isc_nm_t **netmgrp) {
|
|
||||||
isc_nm_t *mgr = NULL;
|
|
||||||
|
|
||||||
REQUIRE(VALID_NM(*netmgrp));
|
|
||||||
|
|
||||||
mgr = *netmgrp;
|
|
||||||
*netmgrp = NULL;
|
|
||||||
|
|
||||||
REQUIRE(isc_refcount_decrement(&mgr->references) == 1);
|
|
||||||
nm_destroy(&mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_nm_maxudp(isc_nm_t *mgr, uint32_t maxudp) {
|
isc_nm_maxudp(isc_nm_t *mgr, uint32_t maxudp) {
|
||||||
|
@ -245,7 +245,7 @@ teardown_test(void **state) {
|
|||||||
isc_tlsctx_cache_detach(&tls_tlsctx_client_cache);
|
isc_tlsctx_cache_detach(&tls_tlsctx_client_cache);
|
||||||
isc_tlsctx_free(&tls_listen_tlsctx);
|
isc_tlsctx_free(&tls_listen_tlsctx);
|
||||||
|
|
||||||
isc_netmgr_destroy(&connect_nm);
|
isc_nm_detach(&connect_nm);
|
||||||
|
|
||||||
teardown_netmgr(state);
|
teardown_netmgr(state);
|
||||||
teardown_loopmgr(state);
|
teardown_loopmgr(state);
|
||||||
|
@ -377,7 +377,7 @@ setup_test(void **state) {
|
|||||||
static int
|
static int
|
||||||
teardown_test(void **state ISC_ATTR_UNUSED) {
|
teardown_test(void **state ISC_ATTR_UNUSED) {
|
||||||
for (size_t i = 0; i < MAX_NM; i++) {
|
for (size_t i = 0; i < MAX_NM; i++) {
|
||||||
isc_netmgr_destroy(&nm[i]);
|
isc_nm_detach(&nm[i]);
|
||||||
assert_null(nm[i]);
|
assert_null(nm[i]);
|
||||||
}
|
}
|
||||||
isc_mem_cput(mctx, nm, MAX_NM, sizeof(nm[0]));
|
isc_mem_cput(mctx, nm, MAX_NM, sizeof(nm[0]));
|
||||||
|
@ -226,10 +226,10 @@ teardown_netmgr_test(void **state ISC_ATTR_UNUSED) {
|
|||||||
isc_tlsctx_free(&tcp_connect_tlsctx);
|
isc_tlsctx_free(&tcp_connect_tlsctx);
|
||||||
isc_tlsctx_free(&tcp_listen_tlsctx);
|
isc_tlsctx_free(&tcp_listen_tlsctx);
|
||||||
|
|
||||||
isc_netmgr_destroy(&connect_nm);
|
isc_nm_detach(&connect_nm);
|
||||||
assert_null(connect_nm);
|
assert_null(connect_nm);
|
||||||
|
|
||||||
isc_netmgr_destroy(&listen_nm);
|
isc_nm_detach(&listen_nm);
|
||||||
assert_null(listen_nm);
|
assert_null(listen_nm);
|
||||||
|
|
||||||
teardown_loopmgr(state);
|
teardown_loopmgr(state);
|
||||||
|
@ -121,7 +121,7 @@ int
|
|||||||
teardown_netmgr(void **state ISC_ATTR_UNUSED) {
|
teardown_netmgr(void **state ISC_ATTR_UNUSED) {
|
||||||
REQUIRE(loopmgr != NULL);
|
REQUIRE(loopmgr != NULL);
|
||||||
|
|
||||||
isc_netmgr_destroy(&netmgr);
|
isc_nm_detach(&netmgr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user