2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-22 01:59:26 +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:
Ondřej Surý 2025-07-09 11:01:15 +02:00
parent 51d7efbfb4
commit cca4b26d31
No known key found for this signature in database
GPG Key ID: 2820F37E873DEA41
7 changed files with 30 additions and 64 deletions

View File

@ -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.
*/
void
isc_netmgr_destroy(isc_nm_t **netmgrp);
/*%<
* Similar to isc_nm_detach(), but requires all other references to be gone.
*/
#if ISC_NETMGR_TRACE
#define isc_nm_ref(ptr) isc_nm__ref(ptr, __func__, __FILE__, __LINE__)
#define isc_nm_unref(ptr) isc_nm__unref(ptr, __func__, __FILE__, __LINE__)
#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
* released, the network manager is shut down, freeing all resources.

View File

@ -45,7 +45,7 @@ isc_managers_destroy(isc_mem_t **mctxp, isc_loopmgr_t **loopmgrp,
* The sequence of operations here is important:
*/
isc_netmgr_destroy(netmgrp);
isc_nm_detach(netmgrp);
isc_loopmgr_destroy(loopmgrp);
isc_mem_detach(mctxp);
}

View File

@ -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.
*/
static void
nm_destroy(isc_nm_t **mgr0) {
REQUIRE(VALID_NM(*mgr0));
nm_destroy(isc_nm_t *netmgr) {
REQUIRE(VALID_NM(netmgr));
isc_nm_t *mgr = *mgr0;
*mgr0 = NULL;
isc_refcount_destroy(&netmgr->references);
isc_refcount_destroy(&mgr->references);
netmgr->magic = 0;
mgr->magic = 0;
if (mgr->stats != NULL) {
isc_stats_detach(&mgr->stats);
if (netmgr->stats != NULL) {
isc_stats_detach(&netmgr->stats);
}
isc_mem_cput(mgr->mctx, mgr->workers, mgr->nloops,
sizeof(mgr->workers[0]));
isc_mem_putanddetach(&mgr->mctx, mgr, sizeof(*mgr));
isc_mem_cput(netmgr->mctx, netmgr->workers, netmgr->nloops,
sizeof(netmgr->workers[0]));
isc_mem_putanddetach(&netmgr->mctx, netmgr, sizeof(*netmgr));
}
void
isc_nm_attach(isc_nm_t *mgr, isc_nm_t **dst) {
REQUIRE(VALID_NM(mgr));
REQUIRE(dst != NULL && *dst == NULL);
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);
}
#if ISC_NETMGR_TRACE
ISC_REFCOUNT_TRACE_IMPL(isc_nm, nm_destroy)
#else
ISC_REFCOUNT_IMPL(isc_nm, nm_destroy);
#endif
void
isc_nm_maxudp(isc_nm_t *mgr, uint32_t maxudp) {

View File

@ -245,7 +245,7 @@ teardown_test(void **state) {
isc_tlsctx_cache_detach(&tls_tlsctx_client_cache);
isc_tlsctx_free(&tls_listen_tlsctx);
isc_netmgr_destroy(&connect_nm);
isc_nm_detach(&connect_nm);
teardown_netmgr(state);
teardown_loopmgr(state);

View File

@ -377,7 +377,7 @@ setup_test(void **state) {
static int
teardown_test(void **state ISC_ATTR_UNUSED) {
for (size_t i = 0; i < MAX_NM; i++) {
isc_netmgr_destroy(&nm[i]);
isc_nm_detach(&nm[i]);
assert_null(nm[i]);
}
isc_mem_cput(mctx, nm, MAX_NM, sizeof(nm[0]));

View File

@ -226,10 +226,10 @@ teardown_netmgr_test(void **state ISC_ATTR_UNUSED) {
isc_tlsctx_free(&tcp_connect_tlsctx);
isc_tlsctx_free(&tcp_listen_tlsctx);
isc_netmgr_destroy(&connect_nm);
isc_nm_detach(&connect_nm);
assert_null(connect_nm);
isc_netmgr_destroy(&listen_nm);
isc_nm_detach(&listen_nm);
assert_null(listen_nm);
teardown_loopmgr(state);

View File

@ -121,7 +121,7 @@ int
teardown_netmgr(void **state ISC_ATTR_UNUSED) {
REQUIRE(loopmgr != NULL);
isc_netmgr_destroy(&netmgr);
isc_nm_detach(&netmgr);
return 0;
}