From 0d993c02babc1e00516272783b310e83bb292d5c Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 19 Jul 2002 03:39:44 +0000 Subject: [PATCH] 1250. [bug] When processing events (non-threaded) only allow the task one chance to use to use its quantum. --- CHANGES | 3 +++ lib/isc/include/isc/types.h | 3 ++- lib/isc/task.c | 15 +++++++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 2705d14d5c..a539f23745 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +1250. [bug] When processing events (non-threaded) only allow + the task one chance to use to use its quantum. + 1249. [func] named-checkzone will now check if nameservers that appear to be IP addresses. Available modes "fail", "warn" (default) and "ignore" the results of the diff --git a/lib/isc/include/isc/types.h b/lib/isc/include/isc/types.h index f59ae3cd22..b30f55ee7f 100644 --- a/lib/isc/include/isc/types.h +++ b/lib/isc/include/isc/types.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.32 2001/01/09 21:57:42 bwelling Exp $ */ +/* $Id: types.h,v 1.33 2002/07/19 03:39:44 marka Exp $ */ #ifndef ISC_TYPES_H #define ISC_TYPES_H 1 @@ -78,6 +78,7 @@ typedef struct isc_socketevent isc_socketevent_t; typedef struct isc_socketmgr isc_socketmgr_t; typedef struct isc_symtab isc_symtab_t; typedef struct isc_task isc_task_t; +typedef ISC_LIST(isc_task_t) isc_tasklist_t; typedef struct isc_taskmgr isc_taskmgr_t; typedef struct isc_textregion isc_textregion_t; typedef struct isc_time isc_time_t; diff --git a/lib/isc/task.c b/lib/isc/task.c index 21a72e0e1e..dba0f9fdad 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: task.c,v 1.87 2002/03/29 01:25:04 marka Exp $ */ +/* $Id: task.c,v 1.88 2002/07/19 03:39:43 marka Exp $ */ /* * Principal Author: Bob Halley @@ -111,7 +111,7 @@ struct isc_taskmgr { /* Locked by task manager lock. */ unsigned int default_quantum; LIST(isc_task_t) tasks; - LIST(isc_task_t) ready_tasks; + isc_tasklist_t ready_tasks; #ifdef ISC_PLATFORM_USETHREADS isc_condition_t work_available; isc_condition_t exclusive_granted; @@ -726,6 +726,7 @@ dispatch(isc_taskmgr_t *manager) { isc_task_t *task; #ifndef ISC_PLATFORM_USETHREADS unsigned int total_dispatch_count = 0; + isc_tasklist_t ready_tasks; #endif /* ISC_PLATFORM_USETHREADS */ REQUIRE(VALID_MANAGER(manager)); @@ -780,6 +781,9 @@ dispatch(isc_taskmgr_t *manager) { * unlocks. The while expression is always protected by the lock. */ +#ifndef ISC_PLATFORM_USETHREADS + ISC_LIST_INIT(ready_tasks); +#endif LOCK(&manager->lock); while (!FINISHED(manager)) { #ifdef ISC_PLATFORM_USETHREADS @@ -965,11 +969,18 @@ dispatch(isc_taskmgr_t *manager) { * were usually nonempty, the 'optimization' * might even hurt rather than help. */ +#ifdef ISC_PLATFORM_USETHREADS ENQUEUE(manager->ready_tasks, task, ready_link); +#else + ENQUEUE(ready_tasks, task, ready_link); +#endif } } } +#ifndef ISC_PLATFORM_USETHREADS + ISC_LIST_APPENDLIST(manager->ready_tasks, ready_tasks, ready_link); +#endif UNLOCK(&manager->lock); }