From: Witold Kręcicki Date: Wed, 13 Nov 2019 10:26:34 +0000 (+0100) Subject: If a task is running and we call isc_task_pause it can X-Git-Tag: v9.15.6~12^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ce4b04b50070d1b2ebc3920891ec3835390a38f;p=thirdparty%2Fbind9.git If a task is running and we call isc_task_pause it can be implicitly unpaused when we switch from 'running' to 'idle' state. Fix it by not switching to 'idle' when paused. --- diff --git a/lib/isc/task.c b/lib/isc/task.c index 81009538c03..19449aacf77 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1190,7 +1190,11 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) { finished = true; task->state = task_state_done; } else { - task->state = task_state_idle; + /* It might be paused */ + if (task->state == + task_state_running) { + task->state = task_state_idle; + } } done = true; } else if (dispatch_count >= task->quantum) { @@ -1205,8 +1209,14 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) { * so the minimum quantum is one. */ XTRACE("quantum"); - task->state = task_state_ready; - requeue = true; + if (task->state == task_state_running) { + /* + * We requeue only if it's + * not paused. + */ + task->state = task_state_ready; + requeue = true; + } done = true; } } while (!done);