diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 421d7d51eb..6a178f1288 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -64,9 +64,14 @@ ns_server_destroy(ns_server_t **serverp); * Destroy a server object, freeing its memory. */ -isc_result_t ns_server_init(void); +isc_result_t ns_server_setup(void); /* - * Create the singleton names server object of BIND 9. + * Perform global server setup. + */ + +void ns_server_cleanup(void); +/* + * Perform global server cleanup */ void diff --git a/bin/named/main.c b/bin/named/main.c index cf43722cf9..92fd1f4629 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -250,7 +250,7 @@ setup() { ns_main_earlyfatal("create_managers() failed: %s", isc_result_totext(result)); - result = ns_server_init(); + result = ns_server_setup(); if (result != ISC_R_SUCCESS) ns_main_earlyfatal("ns_server_init() failed: %s", isc_result_totext(result)); @@ -259,6 +259,7 @@ setup() { static void cleanup() { destroy_managers(); + ns_server_cleanup(); isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ISC_LOG_NOTICE, "exiting"); ns_log_shutdown(); diff --git a/bin/named/server.c b/bin/named/server.c index 974ade40f2..3fed9c5bf9 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -612,19 +612,17 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { dns_view_detach(&view); } + RWUNLOCK(&server->viewlock, isc_rwlocktype_write); + dns_tkey_destroy(); dns_tsig_destroy(); - RWUNLOCK(&server->viewlock, isc_rwlocktype_write); + ns_interfacemgr_shutdown(server->interfacemgr); + ns_interfacemgr_detach(&server->interfacemgr); + dns_zonemgr_destroy(&ns_g_zonemgr); isc_task_detach(&server_task); - dns_zonemgr_destroy(&ns_g_zonemgr); - - ns_rootns_destroy(); - - ns_server_destroy(&server); - isc_event_free(&event); } @@ -677,13 +675,6 @@ ns_server_destroy(ns_server_t **serverp) { ns_server_t *server = *serverp; REQUIRE(NS_SERVER_VALID(server)); - /* - * The interface manager owns tasks, so we have to destroy it before - * we destroy the task manager. - */ - ns_interfacemgr_shutdown(server->interfacemgr); - ns_interfacemgr_detach(&server->interfacemgr); - INSIST(ISC_LIST_EMPTY(server->viewlist)); isc_rwlock_destroy(&server->viewlock); @@ -703,7 +694,7 @@ ns_server_destroy(ns_server_t **serverp) { } isc_result_t -ns_server_init() { +ns_server_setup(void) { isc_result_t result; /* @@ -751,6 +742,13 @@ ns_server_init() { return (result); } +void +ns_server_cleanup(void) +{ + ns_rootns_destroy(); + ns_server_destroy(&ns_g_server); +} + void ns_server_fatal(isc_logmodule_t *module, isc_boolean_t want_core, const char *format, ...) diff --git a/bin/named/xfrout.c b/bin/named/xfrout.c index 0e49fa748e..cd27a7ff4e 100644 --- a/bin/named/xfrout.c +++ b/bin/named/xfrout.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: xfrout.c,v 1.34 2000/01/11 21:18:21 gson Exp $ */ + /* $Id: xfrout.c,v 1.35 2000/01/12 01:17:26 gson Exp $ */ #include @@ -1045,6 +1045,7 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id, return (DNS_R_NOMEMORY); xfr->mctx = mctx; xfr->client = client; + ns_client_wait(client); xfr->id = id; xfr->qname = qname; xfr->qtype = qtype; @@ -1372,6 +1373,8 @@ xfrout_ctx_destroy(xfrout_ctx_t **xfrp) { if (xfr->db != NULL) dns_db_detach(&xfr->db); + ns_client_unwait(xfr->client); + isc_mem_put(xfr->mctx, xfr, sizeof(*xfr)); *xfrp = NULL;