mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 15:05:23 +00:00
Fix shutdown problems associated with lwresd.
This commit is contained in:
@@ -89,6 +89,7 @@ clientmgr_can_die(ns_lwdclientmgr_t *cm) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
lwres_context_destroy(&cm->lwctx);
|
lwres_context_destroy(&cm->lwctx);
|
||||||
|
isc_socket_detach(&cm->sock);
|
||||||
dns_view_detach(&cm->view);
|
dns_view_detach(&cm->view);
|
||||||
isc_task_detach(&cm->task);
|
isc_task_detach(&cm->task);
|
||||||
}
|
}
|
||||||
|
@@ -93,6 +93,12 @@ shutdown_lwresd(isc_task_t *task, isc_event_t *event) {
|
|||||||
for (i = 0; i < lwresd->ntasks; i++)
|
for (i = 0; i < lwresd->ntasks; i++)
|
||||||
isc_task_shutdown(lwresd->cmgr[i].task);
|
isc_task_shutdown(lwresd->cmgr[i].task);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for everything to die off by waiting for the sockets
|
||||||
|
* to be detached.
|
||||||
|
*/
|
||||||
|
isc_socket_detach(&lwresd->sock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kill off the view.
|
* Kill off the view.
|
||||||
*/
|
*/
|
||||||
@@ -337,7 +343,8 @@ ns_lwresd_create(isc_mem_t *mctx, dns_view_t *view, ns_lwresd_t **lwresdp) {
|
|||||||
for (i = 0 ; i < NTASKS ; i++) {
|
for (i = 0 ; i < NTASKS ; i++) {
|
||||||
char name[16];
|
char name[16];
|
||||||
lwresd->cmgr[i].task = NULL;
|
lwresd->cmgr[i].task = NULL;
|
||||||
lwresd->cmgr[i].sock = lwresd->sock;
|
lwresd->cmgr[i].sock = NULL;
|
||||||
|
isc_socket_attach(lwresd->sock, &lwresd->cmgr[i].sock);
|
||||||
lwresd->cmgr[i].view = NULL;
|
lwresd->cmgr[i].view = NULL;
|
||||||
lwresd->cmgr[i].flags = 0;
|
lwresd->cmgr[i].flags = 0;
|
||||||
result = isc_task_create(ns_g_taskmgr, 0,
|
result = isc_task_create(ns_g_taskmgr, 0,
|
||||||
@@ -400,16 +407,13 @@ void
|
|||||||
ns_lwresd_destroy(ns_lwresd_t **lwresdp) {
|
ns_lwresd_destroy(ns_lwresd_t **lwresdp) {
|
||||||
ns_lwresd_t *lwresd;
|
ns_lwresd_t *lwresd;
|
||||||
ns_lwdclient_t *client;
|
ns_lwdclient_t *client;
|
||||||
|
isc_mem_t *mctx;
|
||||||
|
|
||||||
REQUIRE(lwresdp != NULL);
|
REQUIRE(lwresdp != NULL);
|
||||||
lwresd = *lwresdp;
|
lwresd = *lwresdp;
|
||||||
REQUIRE(VALID_LWRESD(lwresd));
|
REQUIRE(VALID_LWRESD(lwresd));
|
||||||
|
|
||||||
/*
|
mctx = lwresd->mctx;
|
||||||
* Wait for everything to die off by waiting for the sockets
|
|
||||||
* to be detached.
|
|
||||||
*/
|
|
||||||
isc_socket_detach(&lwresd->sock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free up memory allocated. This is somewhat magical. We allocated
|
* Free up memory allocated. This is somewhat magical. We allocated
|
||||||
@@ -419,13 +423,15 @@ ns_lwresd_destroy(ns_lwresd_t **lwresdp) {
|
|||||||
client = ISC_LIST_HEAD(lwresd->cmgr[0].idle);
|
client = ISC_LIST_HEAD(lwresd->cmgr[0].idle);
|
||||||
while (client != NULL) {
|
while (client != NULL) {
|
||||||
ISC_LIST_UNLINK(lwresd->cmgr[0].idle, client, link);
|
ISC_LIST_UNLINK(lwresd->cmgr[0].idle, client, link);
|
||||||
isc_mem_put(lwresd->mctx, client,
|
isc_mem_put(mctx, client,
|
||||||
sizeof(ns_lwdclient_t) * lwresd->ntasks);
|
sizeof(ns_lwdclient_t) * lwresd->ntasks);
|
||||||
client = ISC_LIST_HEAD(lwresd->cmgr[0].idle);
|
client = ISC_LIST_HEAD(lwresd->cmgr[0].idle);
|
||||||
}
|
}
|
||||||
INSIST(ISC_LIST_EMPTY(lwresd->cmgr[0].running));
|
INSIST(ISC_LIST_EMPTY(lwresd->cmgr[0].running));
|
||||||
|
|
||||||
|
isc_mem_put(mctx, lwresd->cmgr, sizeof(ns_lwdclientmgr_t) * NTASKS);
|
||||||
lwresd->magic = 0;
|
lwresd->magic = 0;
|
||||||
isc_mem_put(lwresd->mctx, lwresd, sizeof(*lwresd));
|
isc_mem_put(mctx, lwresd, sizeof(*lwresd));
|
||||||
|
isc_mem_detach(&mctx);
|
||||||
*lwresdp = NULL;
|
*lwresdp = NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user