* 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.
* The sequence of operations here is important:
*/
- isc_netmgr_destroy(netmgrp);
+ isc_nm_detach(netmgrp);
isc_loopmgr_destroy(loopmgrp);
isc_mem_detach(mctxp);
}
* 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));
-}
-
-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);
- }
+ isc_mem_cput(netmgr->mctx, netmgr->workers, netmgr->nloops,
+ sizeof(netmgr->workers[0]));
+ isc_mem_putanddetach(&netmgr->mctx, netmgr, sizeof(*netmgr));
}
-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) {
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);
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]));
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);
teardown_netmgr(void **state ISC_ATTR_UNUSED) {
REQUIRE(loopmgr != NULL);
- isc_netmgr_destroy(&netmgr);
+ isc_nm_detach(&netmgr);
return 0;
}