mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-24 10:21:10 -05:00
Decouple view->resolver and friends shutdown and detach
In !7538, the shutdown procedure was simplified, but the ordering was wrong, we need to shutdown the resolver, adb and requestmgr before detaching those objects from the view, because there are cross dependencies between at least the resolver and the adb. Execute the shutdown(s) first, only when all three shutdowns have been executed, detach those objects from the view.
This commit is contained in:
parent
004d2a7ad0
commit
dfd195e77c
1 changed files with 22 additions and 12 deletions
|
|
@ -288,12 +288,12 @@ destroy(dns_view_t *view) {
|
|||
if (view->statickeys != NULL) {
|
||||
dns_tsigkeyring_detach(&view->statickeys);
|
||||
}
|
||||
if (view->adb != NULL) {
|
||||
dns_adb_detach(&view->adb);
|
||||
}
|
||||
if (view->resolver != NULL) {
|
||||
dns_resolver_detach(&view->resolver);
|
||||
}
|
||||
|
||||
/* These must have been detached in dns_view_detach() */
|
||||
INSIST(view->adb == NULL);
|
||||
INSIST(view->resolver == NULL);
|
||||
INSIST(view->requestmgr == NULL);
|
||||
|
||||
dns_rrl_view_destroy(view);
|
||||
if (view->rpzs != NULL) {
|
||||
dns_rpz_shutdown_rpzs(view->rpzs);
|
||||
|
|
@ -315,9 +315,6 @@ destroy(dns_view_t *view) {
|
|||
ISC_LIST_UNLINK(view->dlz_unsearched, dlzdb, link);
|
||||
dns_dlzdestroy(&dlzdb);
|
||||
}
|
||||
if (view->requestmgr != NULL) {
|
||||
dns_requestmgr_detach(&view->requestmgr);
|
||||
}
|
||||
if (view->hints != NULL) {
|
||||
dns_db_detach(&view->hints);
|
||||
}
|
||||
|
|
@ -513,20 +510,35 @@ dns_view_detach(dns_view_t **viewp) {
|
|||
|
||||
isc_refcount_destroy(&view->references);
|
||||
|
||||
/* Shutdown the attached objects first */
|
||||
if (view->resolver != NULL) {
|
||||
dns_resolver_shutdown(view->resolver);
|
||||
}
|
||||
if (view->adb != NULL) {
|
||||
dns_adb_shutdown(view->adb);
|
||||
}
|
||||
if (view->requestmgr != NULL) {
|
||||
dns_requestmgr_shutdown(view->requestmgr);
|
||||
}
|
||||
|
||||
/* Swap the pointers under the lock */
|
||||
LOCK(&view->lock);
|
||||
|
||||
if (view->resolver != NULL) {
|
||||
resolver = view->resolver;
|
||||
view->resolver = NULL;
|
||||
}
|
||||
|
||||
if (view->adb != NULL) {
|
||||
adb = view->adb;
|
||||
view->adb = NULL;
|
||||
}
|
||||
|
||||
if (view->requestmgr != NULL) {
|
||||
requestmgr = view->requestmgr;
|
||||
view->requestmgr = NULL;
|
||||
}
|
||||
|
||||
if (view->zonetable != NULL) {
|
||||
zt = view->zonetable;
|
||||
view->zonetable = NULL;
|
||||
|
|
@ -559,17 +571,15 @@ dns_view_detach(dns_view_t **viewp) {
|
|||
|
||||
/* Detach outside view lock */
|
||||
if (resolver != NULL) {
|
||||
dns_resolver_shutdown(resolver);
|
||||
dns_resolver_detach(&resolver);
|
||||
}
|
||||
if (adb != NULL) {
|
||||
dns_adb_shutdown(adb);
|
||||
dns_adb_detach(&adb);
|
||||
}
|
||||
if (requestmgr != NULL) {
|
||||
dns_requestmgr_shutdown(requestmgr);
|
||||
dns_requestmgr_detach(&requestmgr);
|
||||
}
|
||||
|
||||
if (zt != NULL) {
|
||||
dns_zt_detach(&zt);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue