From: Ondřej Surý Date: Wed, 5 Jan 2022 10:48:22 +0000 (+0100) Subject: On shutdown, return ISC_R_SHUTTINGDOWN from isc_taskmgr_excltask() X-Git-Tag: v9.17.22~11^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f9d90159b84831fd83d74594827fedf0f4e9e265;p=thirdparty%2Fbind9.git On shutdown, return ISC_R_SHUTTINGDOWN from isc_taskmgr_excltask() The isc_taskmgr_excltask() would return ISC_R_NOTFOUND either when the exclusive task was not set (yet) or when the taskmgr is shutting down and the exclusive task has been already cleared. Distinguish between the two states and return ISC_R_SHUTTINGDOWN when the taskmgr is being shut down instead of ISC_R_NOTFOUND. --- diff --git a/lib/isc/task.c b/lib/isc/task.c index 2cfe953b339..cf22e91d53b 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1084,7 +1084,7 @@ isc_taskmgr_setexcltask(isc_taskmgr_t *mgr, isc_task_t *task) { isc_result_t isc_taskmgr_excltask(isc_taskmgr_t *mgr, isc_task_t **taskp) { - isc_result_t result = ISC_R_SUCCESS; + isc_result_t result; REQUIRE(VALID_MANAGER(mgr)); REQUIRE(taskp != NULL && *taskp == NULL); @@ -1092,6 +1092,9 @@ isc_taskmgr_excltask(isc_taskmgr_t *mgr, isc_task_t **taskp) { LOCK(&mgr->excl_lock); if (mgr->excl != NULL) { isc_task_attach(mgr->excl, taskp); + result = ISC_R_SUCCESS; + } else if (atomic_load_relaxed(&mgr->exiting)) { + result = ISC_R_SHUTTINGDOWN; } else { result = ISC_R_NOTFOUND; }