From e0d8e8073f380846c35ce31fe451d93deed573ae Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Mon, 17 Jan 2000 23:41:33 +0000 Subject: [PATCH] If creating a task and the manager is exiting, return ISC_R_SHUTTINGDOWN --- lib/isc/include/isc/task.h | 3 ++- lib/isc/task.c | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/isc/include/isc/task.h b/lib/isc/include/isc/task.h index 4524535667..505617c678 100644 --- a/lib/isc/include/isc/task.h +++ b/lib/isc/include/isc/task.h @@ -76,7 +76,7 @@ isc_result_t isc_task_create(isc_taskmgr_t *manager, isc_mem_t *mctx, unsigned int quantum, isc_task_t **taskp); /* - * Create a task running. + * Create a task. * * Notes: * @@ -106,6 +106,7 @@ isc_task_create(isc_taskmgr_t *manager, isc_mem_t *mctx, * ISC_R_SUCCESS * ISC_R_NOMEMORY * ISC_R_UNEXPECTED + * ISC_R_SHUTTINGDOWN */ void diff --git a/lib/isc/task.c b/lib/isc/task.c index c8c4ed4bc3..269ff2f7db 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -145,6 +145,7 @@ isc_task_create(isc_taskmgr_t *manager, isc_mem_t *mctx, unsigned int quantum, isc_task_t **taskp) { isc_task_t *task; + isc_boolean_t exiting; REQUIRE(VALID_MANAGER(manager)); REQUIRE(taskp != NULL && *taskp == NULL); @@ -172,13 +173,22 @@ isc_task_create(isc_taskmgr_t *manager, isc_mem_t *mctx, unsigned int quantum, INIT_LINK(task, link); INIT_LINK(task, ready_link); + exiting = ISC_FALSE; LOCK(&manager->lock); - /* XXX Should disallow if task manager is exiting. */ - if (task->quantum == 0) - task->quantum = manager->default_quantum; - APPEND(manager->tasks, task, link); + if (!manager->exiting) { + if (task->quantum == 0) + task->quantum = manager->default_quantum; + APPEND(manager->tasks, task, link); + } else + exiting = ISC_TRUE; UNLOCK(&manager->lock); + if (exiting) { + isc_mutex_destroy(&task->lock); + isc_mem_put(mctx, task, sizeof *task); + return (ISC_R_SHUTTINGDOWN); + } + task->magic = TASK_MAGIC; *taskp = task;