diff --git a/lib/isc/task.c b/lib/isc/task.c index 8d6d409d35..e823a177f5 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1570,10 +1570,12 @@ isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp) { isc_result_t isc_task_beginexclusive(isc_task_t *task0) { isc__task_t *task = (isc__task_t *)task0; - isc__taskmgr_t *manager = task->manager; + isc__taskmgr_t *manager; REQUIRE(VALID_TASK(task)); + manager = task->manager; + REQUIRE(task->state == task_state_running); LOCK(&manager->excl_lock); @@ -1602,10 +1604,13 @@ isc_task_beginexclusive(isc_task_t *task0) { void isc_task_endexclusive(isc_task_t *task0) { isc__task_t *task = (isc__task_t *)task0; - isc__taskmgr_t *manager = task->manager; + isc__taskmgr_t *manager; REQUIRE(VALID_TASK(task)); REQUIRE(task->state == task_state_running); + + manager = task->manager; + LOCK(&manager->halt_lock); REQUIRE(atomic_load_relaxed(&manager->exclusive_req) == true); atomic_store_relaxed(&manager->exclusive_req, false);