Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/ntp/lib/isc/task.c
Show First 20 Lines • Show All 323 Lines • ▼ Show 20 Lines | #endif /* USE_WORKER_THREADS */ | ||||
task->common.magic = 0; | task->common.magic = 0; | ||||
isc_mem_put(manager->mctx, task, sizeof(*task)); | isc_mem_put(manager->mctx, task, sizeof(*task)); | ||||
} | } | ||||
ISC_TASKFUNC_SCOPE isc_result_t | ISC_TASKFUNC_SCOPE isc_result_t | ||||
isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum, | isc__task_create(isc_taskmgr_t *manager0, unsigned int quantum, | ||||
isc_task_t **taskp) | isc_task_t **taskp) | ||||
{ | { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
isc__task_t *task; | isc__task_t *task; | ||||
isc_boolean_t exiting; | isc_boolean_t exiting; | ||||
isc_result_t result; | isc_result_t result; | ||||
REQUIRE(VALID_MANAGER(manager)); | REQUIRE(VALID_MANAGER(manager)); | ||||
REQUIRE(taskp != NULL && *taskp == NULL); | REQUIRE(taskp != NULL && *taskp == NULL); | ||||
task = isc_mem_get(manager->mctx, sizeof(*task)); | task = isc_mem_get(manager->mctx, sizeof(*task)); | ||||
▲ Show 20 Lines • Show All 1,117 Lines • ▼ Show 20 Lines | isc__taskmgr_destroy(isc_taskmgr_t **managerp) { | ||||
isc__task_t *task; | isc__task_t *task; | ||||
unsigned int i; | unsigned int i; | ||||
/* | /* | ||||
* Destroy '*managerp'. | * Destroy '*managerp'. | ||||
*/ | */ | ||||
REQUIRE(managerp != NULL); | REQUIRE(managerp != NULL); | ||||
manager = (isc__taskmgr_t *)*managerp; | manager = (void*)(*managerp); | ||||
REQUIRE(VALID_MANAGER(manager)); | REQUIRE(VALID_MANAGER(manager)); | ||||
#ifndef USE_WORKER_THREADS | #ifndef USE_WORKER_THREADS | ||||
UNUSED(i); | UNUSED(i); | ||||
#endif /* USE_WORKER_THREADS */ | #endif /* USE_WORKER_THREADS */ | ||||
#ifdef USE_SHARED_MANAGER | #ifdef USE_SHARED_MANAGER | ||||
manager->refs--; | manager->refs--; | ||||
▲ Show 20 Lines • Show All 79 Lines • ▼ Show 20 Lines | #endif /* USE_WORKER_THREADS */ | ||||
manager_free(manager); | manager_free(manager); | ||||
*managerp = NULL; | *managerp = NULL; | ||||
} | } | ||||
ISC_TASKFUNC_SCOPE void | ISC_TASKFUNC_SCOPE void | ||||
isc__taskmgr_setmode(isc_taskmgr_t *manager0, isc_taskmgrmode_t mode) { | isc__taskmgr_setmode(isc_taskmgr_t *manager0, isc_taskmgrmode_t mode) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
LOCK(&manager->lock); | LOCK(&manager->lock); | ||||
manager->mode = mode; | manager->mode = mode; | ||||
UNLOCK(&manager->lock); | UNLOCK(&manager->lock); | ||||
} | } | ||||
ISC_TASKFUNC_SCOPE isc_taskmgrmode_t | ISC_TASKFUNC_SCOPE isc_taskmgrmode_t | ||||
isc__taskmgr_mode(isc_taskmgr_t *manager0) { | isc__taskmgr_mode(isc_taskmgr_t *manager0) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
isc_taskmgrmode_t mode; | isc_taskmgrmode_t mode; | ||||
LOCK(&manager->lock); | LOCK(&manager->lock); | ||||
mode = manager->mode; | mode = manager->mode; | ||||
UNLOCK(&manager->lock); | UNLOCK(&manager->lock); | ||||
return (mode); | return (mode); | ||||
} | } | ||||
#ifndef USE_WORKER_THREADS | #ifndef USE_WORKER_THREADS | ||||
isc_boolean_t | isc_boolean_t | ||||
isc__taskmgr_ready(isc_taskmgr_t *manager0) { | isc__taskmgr_ready(isc_taskmgr_t *manager0) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
isc_boolean_t is_ready; | isc_boolean_t is_ready; | ||||
#ifdef USE_SHARED_MANAGER | #ifdef USE_SHARED_MANAGER | ||||
if (manager == NULL) | if (manager == NULL) | ||||
manager = taskmgr; | manager = taskmgr; | ||||
#endif | #endif | ||||
if (manager == NULL) | if (manager == NULL) | ||||
return (ISC_FALSE); | return (ISC_FALSE); | ||||
LOCK(&manager->lock); | LOCK(&manager->lock); | ||||
is_ready = !empty_readyq(manager); | is_ready = !empty_readyq(manager); | ||||
UNLOCK(&manager->lock); | UNLOCK(&manager->lock); | ||||
return (is_ready); | return (is_ready); | ||||
} | } | ||||
isc_result_t | isc_result_t | ||||
isc__taskmgr_dispatch(isc_taskmgr_t *manager0) { | isc__taskmgr_dispatch(isc_taskmgr_t *manager0) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
#ifdef USE_SHARED_MANAGER | #ifdef USE_SHARED_MANAGER | ||||
if (manager == NULL) | if (manager == NULL) | ||||
manager = taskmgr; | manager = taskmgr; | ||||
#endif | #endif | ||||
if (manager == NULL) | if (manager == NULL) | ||||
return (ISC_R_NOTFOUND); | return (ISC_R_NOTFOUND); | ||||
dispatch(manager); | dispatch(manager); | ||||
return (ISC_R_SUCCESS); | return (ISC_R_SUCCESS); | ||||
} | } | ||||
#else | #else | ||||
ISC_TASKFUNC_SCOPE void | ISC_TASKFUNC_SCOPE void | ||||
isc__taskmgr_pause(isc_taskmgr_t *manager0) { | isc__taskmgr_pause(isc_taskmgr_t *manager0) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
LOCK(&manager->lock); | LOCK(&manager->lock); | ||||
while (manager->tasks_running > 0) { | while (manager->tasks_running > 0) { | ||||
WAIT(&manager->paused, &manager->lock); | WAIT(&manager->paused, &manager->lock); | ||||
} | } | ||||
manager->pause_requested = ISC_TRUE; | manager->pause_requested = ISC_TRUE; | ||||
UNLOCK(&manager->lock); | UNLOCK(&manager->lock); | ||||
} | } | ||||
ISC_TASKFUNC_SCOPE void | ISC_TASKFUNC_SCOPE void | ||||
isc__taskmgr_resume(isc_taskmgr_t *manager0) { | isc__taskmgr_resume(isc_taskmgr_t *manager0) { | ||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; | isc__taskmgr_t *manager = (void*)manager0; | ||||
LOCK(&manager->lock); | LOCK(&manager->lock); | ||||
if (manager->pause_requested) { | if (manager->pause_requested) { | ||||
manager->pause_requested = ISC_FALSE; | manager->pause_requested = ISC_FALSE; | ||||
BROADCAST(&manager->work_available); | BROADCAST(&manager->work_available); | ||||
} | } | ||||
UNLOCK(&manager->lock); | UNLOCK(&manager->lock); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 176 Lines • Show Last 20 Lines |