mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
apply the modified style
This commit is contained in:
372
lib/isc/task.c
372
lib/isc/task.c
@@ -93,31 +93,31 @@ static const char *statenames[] = {
|
||||
};
|
||||
#endif /* if defined(HAVE_LIBXML2) || defined(HAVE_JSON_C) */
|
||||
|
||||
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
|
||||
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
|
||||
#define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC)
|
||||
|
||||
typedef struct isc__task isc__task_t;
|
||||
typedef struct isc__taskmgr isc__taskmgr_t;
|
||||
typedef struct isc__task isc__task_t;
|
||||
typedef struct isc__taskmgr isc__taskmgr_t;
|
||||
typedef struct isc__taskqueue isc__taskqueue_t;
|
||||
|
||||
struct isc__task {
|
||||
/* Not locked. */
|
||||
isc_task_t common;
|
||||
isc_task_t common;
|
||||
isc__taskmgr_t *manager;
|
||||
isc_mutex_t lock;
|
||||
isc_mutex_t lock;
|
||||
/* Locked by task lock. */
|
||||
task_state_t state;
|
||||
isc_refcount_t references;
|
||||
task_state_t state;
|
||||
isc_refcount_t references;
|
||||
isc_eventlist_t events;
|
||||
isc_eventlist_t on_shutdown;
|
||||
unsigned int nevents;
|
||||
unsigned int quantum;
|
||||
isc_stdtime_t now;
|
||||
isc_time_t tnow;
|
||||
char name[16];
|
||||
void * tag;
|
||||
unsigned int threadid;
|
||||
bool bound;
|
||||
unsigned int nevents;
|
||||
unsigned int quantum;
|
||||
isc_stdtime_t now;
|
||||
isc_time_t tnow;
|
||||
char name[16];
|
||||
void *tag;
|
||||
unsigned int threadid;
|
||||
bool bound;
|
||||
/* Protected by atomics */
|
||||
atomic_uint_fast32_t flags;
|
||||
/* Locked by task manager lock. */
|
||||
@@ -127,7 +127,7 @@ struct isc__task {
|
||||
};
|
||||
|
||||
#define TASK_F_SHUTTINGDOWN 0x01
|
||||
#define TASK_F_PRIVILEGED 0x02
|
||||
#define TASK_F_PRIVILEGED 0x02
|
||||
|
||||
#define TASK_SHUTTINGDOWN(t) \
|
||||
((atomic_load_acquire(&(t)->flags) & TASK_F_SHUTTINGDOWN) != 0)
|
||||
@@ -138,43 +138,43 @@ struct isc__task {
|
||||
#define TASK_FLAG_CLR(t, f) atomic_fetch_and_release(&(t)->flags, ~(f))
|
||||
|
||||
#define TASK_MANAGER_MAGIC ISC_MAGIC('T', 'S', 'K', 'M')
|
||||
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TASK_MANAGER_MAGIC)
|
||||
#define VALID_MANAGER(m) ISC_MAGIC_VALID(m, TASK_MANAGER_MAGIC)
|
||||
|
||||
typedef ISC_LIST(isc__task_t) isc__tasklist_t;
|
||||
|
||||
struct isc__taskqueue {
|
||||
/* Everything locked by lock */
|
||||
isc_mutex_t lock;
|
||||
isc_mutex_t lock;
|
||||
isc__tasklist_t ready_tasks;
|
||||
isc__tasklist_t ready_priority_tasks;
|
||||
isc_condition_t work_available;
|
||||
isc_thread_t thread;
|
||||
unsigned int threadid;
|
||||
isc_thread_t thread;
|
||||
unsigned int threadid;
|
||||
isc__taskmgr_t *manager;
|
||||
};
|
||||
|
||||
struct isc__taskmgr {
|
||||
/* Not locked. */
|
||||
isc_taskmgr_t common;
|
||||
isc_mem_t * mctx;
|
||||
isc_mutex_t lock;
|
||||
isc_mutex_t halt_lock;
|
||||
isc_condition_t halt_cond;
|
||||
unsigned int workers;
|
||||
isc_taskmgr_t common;
|
||||
isc_mem_t *mctx;
|
||||
isc_mutex_t lock;
|
||||
isc_mutex_t halt_lock;
|
||||
isc_condition_t halt_cond;
|
||||
unsigned int workers;
|
||||
atomic_uint_fast32_t tasks_running;
|
||||
atomic_uint_fast32_t tasks_ready;
|
||||
atomic_uint_fast32_t curq;
|
||||
atomic_uint_fast32_t tasks_count;
|
||||
isc__taskqueue_t * queues;
|
||||
isc_nm_t * nm;
|
||||
isc__taskqueue_t *queues;
|
||||
isc_nm_t *nm;
|
||||
|
||||
/* Locked by task manager lock. */
|
||||
unsigned int default_quantum;
|
||||
LIST(isc__task_t) tasks;
|
||||
atomic_uint_fast32_t mode;
|
||||
atomic_bool pause_req;
|
||||
atomic_bool exclusive_req;
|
||||
atomic_bool exiting;
|
||||
atomic_bool pause_req;
|
||||
atomic_bool exclusive_req;
|
||||
atomic_bool exiting;
|
||||
|
||||
/* Locked by halt_lock */
|
||||
unsigned int halted;
|
||||
@@ -184,14 +184,12 @@ struct isc__taskmgr {
|
||||
* to protect the access. We can't use 'lock' since isc_task_detach()
|
||||
* will try to acquire it.
|
||||
*/
|
||||
isc_mutex_t excl_lock;
|
||||
isc_mutex_t excl_lock;
|
||||
isc__task_t *excl;
|
||||
};
|
||||
|
||||
void
|
||||
isc__taskmgr_pause(isc_taskmgr_t *manager0);
|
||||
void
|
||||
isc__taskmgr_resume(isc_taskmgr_t *manager0);
|
||||
void isc__taskmgr_pause(isc_taskmgr_t *manager0);
|
||||
void isc__taskmgr_resume(isc_taskmgr_t *manager0);
|
||||
|
||||
#define DEFAULT_DEFAULT_QUANTUM 25
|
||||
#define FINISHED(m) \
|
||||
@@ -204,31 +202,24 @@ isc__taskmgr_resume(isc_taskmgr_t *manager0);
|
||||
* unit tests etc.
|
||||
*/
|
||||
|
||||
bool
|
||||
isc_task_purgeevent(isc_task_t *task0, isc_event_t *event);
|
||||
void
|
||||
isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0);
|
||||
isc_result_t
|
||||
isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp);
|
||||
static inline bool
|
||||
empty_readyq(isc__taskmgr_t *manager, int c);
|
||||
bool isc_task_purgeevent(isc_task_t *task0, isc_event_t *event);
|
||||
void isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0);
|
||||
isc_result_t isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp);
|
||||
static inline bool empty_readyq(isc__taskmgr_t *manager, int c);
|
||||
|
||||
static inline isc__task_t *
|
||||
pop_readyq(isc__taskmgr_t *manager, int c);
|
||||
static inline isc__task_t *pop_readyq(isc__taskmgr_t *manager, int c);
|
||||
|
||||
static inline void
|
||||
push_readyq(isc__taskmgr_t *manager, isc__task_t *task, int c);
|
||||
static inline void push_readyq(isc__taskmgr_t *manager, isc__task_t *task,
|
||||
int c);
|
||||
|
||||
static inline void
|
||||
wake_all_queues(isc__taskmgr_t *manager);
|
||||
static inline void wake_all_queues(isc__taskmgr_t *manager);
|
||||
|
||||
/***
|
||||
*** Tasks.
|
||||
***/
|
||||
|
||||
static inline void
|
||||
wake_all_queues(isc__taskmgr_t *manager)
|
||||
{
|
||||
wake_all_queues(isc__taskmgr_t *manager) {
|
||||
for (unsigned int i = 0; i < manager->workers; i++) {
|
||||
LOCK(&manager->queues[i].lock);
|
||||
BROADCAST(&manager->queues[i].work_available);
|
||||
@@ -237,8 +228,7 @@ wake_all_queues(isc__taskmgr_t *manager)
|
||||
}
|
||||
|
||||
static void
|
||||
task_finished(isc__task_t *task)
|
||||
{
|
||||
task_finished(isc__task_t *task) {
|
||||
isc__taskmgr_t *manager = task->manager;
|
||||
REQUIRE(EMPTY(task->events));
|
||||
REQUIRE(task->nevents == 0);
|
||||
@@ -270,18 +260,16 @@ task_finished(isc__task_t *task)
|
||||
|
||||
isc_result_t
|
||||
isc_task_create(isc_taskmgr_t *manager0, unsigned int quantum,
|
||||
isc_task_t **taskp)
|
||||
{
|
||||
isc_task_t **taskp) {
|
||||
return (isc_task_create_bound(manager0, quantum, taskp, -1));
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
isc_task_create_bound(isc_taskmgr_t *manager0, unsigned int quantum,
|
||||
isc_task_t **taskp, int threadid)
|
||||
{
|
||||
isc_task_t **taskp, int threadid) {
|
||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
|
||||
isc__task_t * task;
|
||||
bool exiting;
|
||||
isc__task_t *task;
|
||||
bool exiting;
|
||||
|
||||
REQUIRE(VALID_MANAGER(manager));
|
||||
REQUIRE(taskp != NULL && *taskp == NULL);
|
||||
@@ -348,8 +336,7 @@ isc_task_create_bound(isc_taskmgr_t *manager0, unsigned int quantum,
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_attach(isc_task_t *source0, isc_task_t **targetp)
|
||||
{
|
||||
isc_task_attach(isc_task_t *source0, isc_task_t **targetp) {
|
||||
isc__task_t *source = (isc__task_t *)source0;
|
||||
|
||||
/*
|
||||
@@ -367,9 +354,8 @@ isc_task_attach(isc_task_t *source0, isc_task_t **targetp)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
task_shutdown(isc__task_t *task)
|
||||
{
|
||||
bool was_idle = false;
|
||||
task_shutdown(isc__task_t *task) {
|
||||
bool was_idle = false;
|
||||
isc_event_t *event, *prev;
|
||||
|
||||
/*
|
||||
@@ -412,10 +398,9 @@ task_shutdown(isc__task_t *task)
|
||||
* Caller must NOT hold manager lock.
|
||||
*/
|
||||
static inline void
|
||||
task_ready(isc__task_t *task)
|
||||
{
|
||||
task_ready(isc__task_t *task) {
|
||||
isc__taskmgr_t *manager = task->manager;
|
||||
bool has_privilege = isc_task_privilege((isc_task_t *)task);
|
||||
bool has_privilege = isc_task_privilege((isc_task_t *)task);
|
||||
|
||||
REQUIRE(VALID_MANAGER(manager));
|
||||
REQUIRE(task->state == task_state_ready);
|
||||
@@ -431,8 +416,7 @@ task_ready(isc__task_t *task)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
task_detach(isc__task_t *task)
|
||||
{
|
||||
task_detach(isc__task_t *task) {
|
||||
/*
|
||||
* Caller must be holding the task lock.
|
||||
*/
|
||||
@@ -440,7 +424,8 @@ task_detach(isc__task_t *task)
|
||||
XTRACE("detach");
|
||||
|
||||
if (isc_refcount_decrement(&task->references) == 1 &&
|
||||
task->state == task_state_idle) {
|
||||
task->state == task_state_idle)
|
||||
{
|
||||
INSIST(EMPTY(task->events));
|
||||
/*
|
||||
* There are no references to this task, and no
|
||||
@@ -458,10 +443,9 @@ task_detach(isc__task_t *task)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_detach(isc_task_t **taskp)
|
||||
{
|
||||
isc_task_detach(isc_task_t **taskp) {
|
||||
isc__task_t *task;
|
||||
bool was_idle;
|
||||
bool was_idle;
|
||||
|
||||
/*
|
||||
* Detach *taskp from its task.
|
||||
@@ -485,9 +469,8 @@ isc_task_detach(isc_task_t **taskp)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
task_send(isc__task_t *task, isc_event_t **eventp, int c)
|
||||
{
|
||||
bool was_idle = false;
|
||||
task_send(isc__task_t *task, isc_event_t **eventp, int c) {
|
||||
bool was_idle = false;
|
||||
isc_event_t *event;
|
||||
|
||||
/*
|
||||
@@ -521,22 +504,19 @@ task_send(isc__task_t *task, isc_event_t **eventp, int c)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_send(isc_task_t *task0, isc_event_t **eventp)
|
||||
{
|
||||
isc_task_send(isc_task_t *task0, isc_event_t **eventp) {
|
||||
isc_task_sendto(task0, eventp, -1);
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp)
|
||||
{
|
||||
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp) {
|
||||
isc_task_sendtoanddetach(taskp, eventp, -1);
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_sendto(isc_task_t *task0, isc_event_t **eventp, int c)
|
||||
{
|
||||
isc_task_sendto(isc_task_t *task0, isc_event_t **eventp, int c) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
bool was_idle;
|
||||
bool was_idle;
|
||||
|
||||
/*
|
||||
* Send '*event' to 'task'.
|
||||
@@ -583,9 +563,8 @@ isc_task_sendto(isc_task_t *task0, isc_event_t **eventp, int c)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c)
|
||||
{
|
||||
bool idle1, idle2;
|
||||
isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c) {
|
||||
bool idle1, idle2;
|
||||
isc__task_t *task;
|
||||
|
||||
/*
|
||||
@@ -629,8 +608,7 @@ isc_task_sendtoanddetach(isc_task_t **taskp, isc_event_t **eventp, int c)
|
||||
static unsigned int
|
||||
dequeue_events(isc__task_t *task, void *sender, isc_eventtype_t first,
|
||||
isc_eventtype_t last, void *tag, isc_eventlist_t *events,
|
||||
bool purging)
|
||||
{
|
||||
bool purging) {
|
||||
isc_event_t *event, *next_event;
|
||||
unsigned int count = 0;
|
||||
|
||||
@@ -654,7 +632,8 @@ dequeue_events(isc__task_t *task, void *sender, isc_eventtype_t first,
|
||||
if (event->ev_type >= first && event->ev_type <= last &&
|
||||
(sender == NULL || event->ev_sender == sender) &&
|
||||
(tag == NULL || event->ev_tag == tag) &&
|
||||
(!purging || PURGE_OK(event))) {
|
||||
(!purging || PURGE_OK(event)))
|
||||
{
|
||||
DEQUEUE(task->events, event, ev_link);
|
||||
task->nevents--;
|
||||
ENQUEUE(*events, event, ev_link);
|
||||
@@ -669,12 +648,11 @@ dequeue_events(isc__task_t *task, void *sender, isc_eventtype_t first,
|
||||
|
||||
unsigned int
|
||||
isc_task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
|
||||
isc_eventtype_t last, void *tag)
|
||||
{
|
||||
isc__task_t * task = (isc__task_t *)task0;
|
||||
unsigned int count;
|
||||
isc_eventtype_t last, void *tag) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
unsigned int count;
|
||||
isc_eventlist_t events;
|
||||
isc_event_t * event, *next_event;
|
||||
isc_event_t *event, *next_event;
|
||||
REQUIRE(VALID_TASK(task));
|
||||
|
||||
/*
|
||||
@@ -701,8 +679,8 @@ isc_task_purgerange(isc_task_t *task0, void *sender, isc_eventtype_t first,
|
||||
}
|
||||
|
||||
unsigned int
|
||||
isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag)
|
||||
{
|
||||
isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
|
||||
void *tag) {
|
||||
/*
|
||||
* Purge events from a task's event queue.
|
||||
*/
|
||||
@@ -714,8 +692,7 @@ isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag)
|
||||
}
|
||||
|
||||
bool
|
||||
isc_task_purgeevent(isc_task_t *task0, isc_event_t *event)
|
||||
{
|
||||
isc_task_purgeevent(isc_task_t *task0, isc_event_t *event) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
isc_event_t *curr_event, *next_event;
|
||||
|
||||
@@ -739,7 +716,8 @@ isc_task_purgeevent(isc_task_t *task0, isc_event_t *event)
|
||||
|
||||
LOCK(&task->lock);
|
||||
for (curr_event = HEAD(task->events); curr_event != NULL;
|
||||
curr_event = next_event) {
|
||||
curr_event = next_event)
|
||||
{
|
||||
next_event = NEXT(curr_event, ev_link);
|
||||
if (curr_event == event && PURGE_OK(event)) {
|
||||
DEQUEUE(task->events, curr_event, ev_link);
|
||||
@@ -760,8 +738,7 @@ isc_task_purgeevent(isc_task_t *task0, isc_event_t *event)
|
||||
|
||||
unsigned int
|
||||
isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
|
||||
isc_eventtype_t last, void *tag, isc_eventlist_t *events)
|
||||
{
|
||||
isc_eventtype_t last, void *tag, isc_eventlist_t *events) {
|
||||
/*
|
||||
* Remove events from a task's event queue.
|
||||
*/
|
||||
@@ -775,8 +752,7 @@ isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
|
||||
|
||||
unsigned int
|
||||
isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag,
|
||||
isc_eventlist_t *events)
|
||||
{
|
||||
isc_eventlist_t *events) {
|
||||
/*
|
||||
* Remove events from a task's event queue.
|
||||
*/
|
||||
@@ -788,10 +764,9 @@ isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type, void *tag,
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
isc_task_onshutdown(isc_task_t *task0, isc_taskaction_t action, void *arg)
|
||||
{
|
||||
isc_task_onshutdown(isc_task_t *task0, isc_taskaction_t action, void *arg) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
bool disallowed = false;
|
||||
bool disallowed = false;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
isc_event_t *event;
|
||||
|
||||
@@ -824,10 +799,9 @@ isc_task_onshutdown(isc_task_t *task0, isc_taskaction_t action, void *arg)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_shutdown(isc_task_t *task0)
|
||||
{
|
||||
isc_task_shutdown(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
bool was_idle;
|
||||
bool was_idle;
|
||||
|
||||
/*
|
||||
* Shutdown 'task'.
|
||||
@@ -845,8 +819,7 @@ isc_task_shutdown(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_destroy(isc_task_t **taskp)
|
||||
{
|
||||
isc_task_destroy(isc_task_t **taskp) {
|
||||
/*
|
||||
* Destroy '*taskp'.
|
||||
*/
|
||||
@@ -858,8 +831,7 @@ isc_task_destroy(isc_task_t **taskp)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_setname(isc_task_t *task0, const char *name, void *tag)
|
||||
{
|
||||
isc_task_setname(isc_task_t *task0, const char *name, void *tag) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
/*
|
||||
@@ -875,8 +847,7 @@ isc_task_setname(isc_task_t *task0, const char *name, void *tag)
|
||||
}
|
||||
|
||||
const char *
|
||||
isc_task_getname(isc_task_t *task0)
|
||||
{
|
||||
isc_task_getname(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -885,8 +856,7 @@ isc_task_getname(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void *
|
||||
isc_task_gettag(isc_task_t *task0)
|
||||
{
|
||||
isc_task_gettag(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -895,8 +865,7 @@ isc_task_gettag(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t)
|
||||
{
|
||||
isc_task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -908,8 +877,7 @@ isc_task_getcurrenttime(isc_task_t *task0, isc_stdtime_t *t)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_getcurrenttimex(isc_task_t *task0, isc_time_t *t)
|
||||
{
|
||||
isc_task_getcurrenttimex(isc_task_t *task0, isc_time_t *t) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -932,8 +900,7 @@ isc_task_getcurrenttimex(isc_task_t *task0, isc_time_t *t)
|
||||
* Caller must hold the task manager lock.
|
||||
*/
|
||||
static inline bool
|
||||
empty_readyq(isc__taskmgr_t *manager, int c)
|
||||
{
|
||||
empty_readyq(isc__taskmgr_t *manager, int c) {
|
||||
isc__tasklist_t queue;
|
||||
|
||||
if (atomic_load_relaxed(&manager->mode) == isc_taskmgrmode_normal) {
|
||||
@@ -953,8 +920,7 @@ empty_readyq(isc__taskmgr_t *manager, int c)
|
||||
* Caller must hold the task manager lock.
|
||||
*/
|
||||
static inline isc__task_t *
|
||||
pop_readyq(isc__taskmgr_t *manager, int c)
|
||||
{
|
||||
pop_readyq(isc__taskmgr_t *manager, int c) {
|
||||
isc__task_t *task;
|
||||
|
||||
if (atomic_load_relaxed(&manager->mode) == isc_taskmgrmode_normal) {
|
||||
@@ -981,8 +947,7 @@ pop_readyq(isc__taskmgr_t *manager, int c)
|
||||
* Caller must hold the task manager lock.
|
||||
*/
|
||||
static inline void
|
||||
push_readyq(isc__taskmgr_t *manager, isc__task_t *task, int c)
|
||||
{
|
||||
push_readyq(isc__taskmgr_t *manager, isc__task_t *task, int c) {
|
||||
ENQUEUE(manager->queues[c].ready_tasks, task, ready_link);
|
||||
if (TASK_PRIVILEGED(task)) {
|
||||
ENQUEUE(manager->queues[c].ready_priority_tasks, task,
|
||||
@@ -993,8 +958,7 @@ push_readyq(isc__taskmgr_t *manager, isc__task_t *task, int c)
|
||||
}
|
||||
|
||||
static void
|
||||
dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
{
|
||||
dispatch(isc__taskmgr_t *manager, unsigned int threadid) {
|
||||
isc__task_t *task;
|
||||
|
||||
REQUIRE(VALID_MANAGER(manager));
|
||||
@@ -1068,7 +1032,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
while ((empty_readyq(manager, threadid) &&
|
||||
!atomic_load_relaxed(&manager->pause_req) &&
|
||||
!atomic_load_relaxed(&manager->exclusive_req)) &&
|
||||
!FINISHED(manager)) {
|
||||
!FINISHED(manager))
|
||||
{
|
||||
XTHREADTRACE("wait");
|
||||
XTHREADTRACE(atomic_load_relaxed(&manager->pause_req)
|
||||
? "paused"
|
||||
@@ -1084,7 +1049,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
XTHREADTRACE("working");
|
||||
|
||||
if (atomic_load_relaxed(&manager->pause_req) ||
|
||||
atomic_load_relaxed(&manager->exclusive_req)) {
|
||||
atomic_load_relaxed(&manager->exclusive_req))
|
||||
{
|
||||
UNLOCK(&manager->queues[threadid].lock);
|
||||
XTHREADTRACE("halting");
|
||||
|
||||
@@ -1105,7 +1071,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
manager->halted++;
|
||||
BROADCAST(&manager->halt_cond);
|
||||
while (atomic_load_relaxed(&manager->pause_req) ||
|
||||
atomic_load_relaxed(&manager->exclusive_req)) {
|
||||
atomic_load_relaxed(&manager->exclusive_req))
|
||||
{
|
||||
WAIT(&manager->halt_cond, &manager->halt_lock);
|
||||
}
|
||||
manager->halted--;
|
||||
@@ -1120,9 +1087,9 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
task = pop_readyq(manager, threadid);
|
||||
if (task != NULL) {
|
||||
unsigned int dispatch_count = 0;
|
||||
bool done = false;
|
||||
bool requeue = false;
|
||||
bool finished = false;
|
||||
bool done = false;
|
||||
bool requeue = false;
|
||||
bool finished = false;
|
||||
isc_event_t *event;
|
||||
|
||||
INSIST(VALID_TASK(task));
|
||||
@@ -1171,7 +1138,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
if (isc_refcount_current(&task->references) ==
|
||||
0 &&
|
||||
EMPTY(task->events) &&
|
||||
!TASK_SHUTTINGDOWN(task)) {
|
||||
!TASK_SHUTTINGDOWN(task))
|
||||
{
|
||||
bool was_idle;
|
||||
|
||||
/*
|
||||
@@ -1296,7 +1264,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
if (atomic_load_relaxed(&manager->mode) !=
|
||||
isc_taskmgrmode_normal &&
|
||||
atomic_load_explicit(&manager->tasks_running,
|
||||
memory_order_acquire) == 0) {
|
||||
memory_order_acquire) == 0)
|
||||
{
|
||||
UNLOCK(&manager->queues[threadid].lock);
|
||||
LOCK(&manager->lock);
|
||||
/*
|
||||
@@ -1309,11 +1278,12 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid)
|
||||
if (atomic_load(&manager->mode) !=
|
||||
isc_taskmgrmode_normal &&
|
||||
atomic_load_explicit(&manager->tasks_running,
|
||||
memory_order_acquire) == 0) {
|
||||
bool empty = true;
|
||||
memory_order_acquire) == 0)
|
||||
{
|
||||
bool empty = true;
|
||||
unsigned int i;
|
||||
for (i = 0; i < manager->workers && empty;
|
||||
i++) {
|
||||
for (i = 0; i < manager->workers && empty; i++)
|
||||
{
|
||||
LOCK(&manager->queues[i].lock);
|
||||
empty &= empty_readyq(manager, i);
|
||||
UNLOCK(&manager->queues[i].lock);
|
||||
@@ -1340,11 +1310,10 @@ static isc_threadresult_t
|
||||
#ifdef _WIN32
|
||||
WINAPI
|
||||
#endif /* ifdef _WIN32 */
|
||||
run(void *queuep)
|
||||
{
|
||||
run(void *queuep) {
|
||||
isc__taskqueue_t *tq = queuep;
|
||||
isc__taskmgr_t * manager = tq->manager;
|
||||
int threadid = tq->threadid;
|
||||
isc__taskmgr_t *manager = tq->manager;
|
||||
int threadid = tq->threadid;
|
||||
isc_thread_setaffinity(threadid);
|
||||
|
||||
XTHREADTRACE("starting");
|
||||
@@ -1361,8 +1330,7 @@ static isc_threadresult_t
|
||||
}
|
||||
|
||||
static void
|
||||
manager_free(isc__taskmgr_t *manager)
|
||||
{
|
||||
manager_free(isc__taskmgr_t *manager) {
|
||||
for (unsigned int i = 0; i < manager->workers; i++) {
|
||||
isc_mutex_destroy(&manager->queues[i].lock);
|
||||
}
|
||||
@@ -1378,9 +1346,8 @@ manager_free(isc__taskmgr_t *manager)
|
||||
isc_result_t
|
||||
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
|
||||
unsigned int default_quantum, isc_nm_t *nm,
|
||||
isc_taskmgr_t **managerp)
|
||||
{
|
||||
unsigned int i;
|
||||
isc_taskmgr_t **managerp) {
|
||||
unsigned int i;
|
||||
isc__taskmgr_t *manager;
|
||||
|
||||
/*
|
||||
@@ -1454,12 +1421,11 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
|
||||
}
|
||||
|
||||
void
|
||||
isc_taskmgr_destroy(isc_taskmgr_t **managerp)
|
||||
{
|
||||
isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
|
||||
isc__taskmgr_t *manager;
|
||||
isc__task_t * task;
|
||||
unsigned int i;
|
||||
bool exiting;
|
||||
isc__task_t *task;
|
||||
unsigned int i;
|
||||
bool exiting;
|
||||
|
||||
/*
|
||||
* Destroy '*managerp'.
|
||||
@@ -1516,8 +1482,8 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp)
|
||||
* posted). To make things easier post idle tasks to worker 0.
|
||||
*/
|
||||
LOCK(&manager->queues[0].lock);
|
||||
for (task = HEAD(manager->tasks); task != NULL;
|
||||
task = NEXT(task, link)) {
|
||||
for (task = HEAD(manager->tasks); task != NULL; task = NEXT(task, link))
|
||||
{
|
||||
LOCK(&task->lock);
|
||||
if (task_shutdown(task)) {
|
||||
task->threadid = 0;
|
||||
@@ -1555,28 +1521,26 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp)
|
||||
}
|
||||
|
||||
void
|
||||
isc_taskmgr_setprivilegedmode(isc_taskmgr_t *manager0)
|
||||
{
|
||||
isc_taskmgr_setprivilegedmode(isc_taskmgr_t *manager0) {
|
||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
|
||||
|
||||
atomic_store(&manager->mode, isc_taskmgrmode_privileged);
|
||||
}
|
||||
|
||||
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;
|
||||
return (atomic_load(&manager->mode));
|
||||
}
|
||||
|
||||
void
|
||||
isc__taskmgr_pause(isc_taskmgr_t *manager0)
|
||||
{
|
||||
isc__taskmgr_pause(isc_taskmgr_t *manager0) {
|
||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
|
||||
|
||||
LOCK(&manager->halt_lock);
|
||||
while (atomic_load_relaxed(&manager->exclusive_req) ||
|
||||
atomic_load_relaxed(&manager->pause_req)) {
|
||||
atomic_load_relaxed(&manager->pause_req))
|
||||
{
|
||||
UNLOCK(&manager->halt_lock);
|
||||
/* This is ugly but pause is used EXCLUSIVELY in tests */
|
||||
isc_thread_yield();
|
||||
@@ -1592,8 +1556,7 @@ isc__taskmgr_pause(isc_taskmgr_t *manager0)
|
||||
}
|
||||
|
||||
void
|
||||
isc__taskmgr_resume(isc_taskmgr_t *manager0)
|
||||
{
|
||||
isc__taskmgr_resume(isc_taskmgr_t *manager0) {
|
||||
isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
|
||||
LOCK(&manager->halt_lock);
|
||||
if (atomic_load(&manager->pause_req)) {
|
||||
@@ -1607,10 +1570,9 @@ isc__taskmgr_resume(isc_taskmgr_t *manager0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0)
|
||||
{
|
||||
isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0) {
|
||||
isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
|
||||
isc__task_t * task = (isc__task_t *)task0;
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
|
||||
REQUIRE(VALID_MANAGER(mgr));
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -1623,10 +1585,9 @@ isc_taskmgr_setexcltask(isc_taskmgr_t *mgr0, isc_task_t *task0)
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp)
|
||||
{
|
||||
isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp) {
|
||||
isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
|
||||
REQUIRE(VALID_MANAGER(mgr));
|
||||
REQUIRE(taskp != NULL && *taskp == NULL);
|
||||
@@ -1643,9 +1604,8 @@ 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_task_beginexclusive(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
isc__taskmgr_t *manager;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -1661,7 +1621,8 @@ isc_task_beginexclusive(isc_task_t *task0)
|
||||
UNLOCK(&manager->excl_lock);
|
||||
|
||||
if (atomic_load_relaxed(&manager->exclusive_req) ||
|
||||
atomic_load_relaxed(&manager->pause_req)) {
|
||||
atomic_load_relaxed(&manager->pause_req))
|
||||
{
|
||||
return (ISC_R_LOCKBUSY);
|
||||
}
|
||||
|
||||
@@ -1681,9 +1642,8 @@ isc_task_beginexclusive(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_endexclusive(isc_task_t *task0)
|
||||
{
|
||||
isc__task_t * task = (isc__task_t *)task0;
|
||||
isc_task_endexclusive(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
isc__taskmgr_t *manager;
|
||||
|
||||
REQUIRE(VALID_TASK(task));
|
||||
@@ -1704,12 +1664,11 @@ isc_task_endexclusive(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_pause(isc_task_t *task0)
|
||||
{
|
||||
isc_task_pause(isc_task_t *task0) {
|
||||
REQUIRE(ISCAPI_TASK_VALID(task0));
|
||||
isc__task_t * task = (isc__task_t *)task0;
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
isc__taskmgr_t *manager = task->manager;
|
||||
bool running = false;
|
||||
bool running = false;
|
||||
|
||||
LOCK(&task->lock);
|
||||
INSIST(task->state == task_state_idle ||
|
||||
@@ -1736,10 +1695,9 @@ isc_task_pause(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_unpause(isc_task_t *task0)
|
||||
{
|
||||
isc_task_unpause(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
bool was_idle = false;
|
||||
bool was_idle = false;
|
||||
|
||||
REQUIRE(ISCAPI_TASK_VALID(task0));
|
||||
|
||||
@@ -1764,12 +1722,11 @@ isc_task_unpause(isc_task_t *task0)
|
||||
}
|
||||
|
||||
void
|
||||
isc_task_setprivilege(isc_task_t *task0, bool priv)
|
||||
{
|
||||
isc_task_setprivilege(isc_task_t *task0, bool priv) {
|
||||
REQUIRE(ISCAPI_TASK_VALID(task0));
|
||||
isc__task_t * task = (isc__task_t *)task0;
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
isc__taskmgr_t *manager = task->manager;
|
||||
uint_fast32_t oldflags, newflags;
|
||||
uint_fast32_t oldflags, newflags;
|
||||
|
||||
oldflags = atomic_load_acquire(&task->flags);
|
||||
do {
|
||||
@@ -1796,8 +1753,7 @@ isc_task_setprivilege(isc_task_t *task0, bool priv)
|
||||
}
|
||||
|
||||
bool
|
||||
isc_task_privilege(isc_task_t *task0)
|
||||
{
|
||||
isc_task_privilege(isc_task_t *task0) {
|
||||
isc__task_t *task = (isc__task_t *)task0;
|
||||
REQUIRE(VALID_TASK(task));
|
||||
|
||||
@@ -1805,8 +1761,7 @@ isc_task_privilege(isc_task_t *task0)
|
||||
}
|
||||
|
||||
bool
|
||||
isc_task_exiting(isc_task_t *t)
|
||||
{
|
||||
isc_task_exiting(isc_task_t *t) {
|
||||
isc__task_t *task = (isc__task_t *)t;
|
||||
REQUIRE(VALID_TASK(task));
|
||||
|
||||
@@ -1821,11 +1776,10 @@ isc_task_exiting(isc_task_t *t)
|
||||
goto error; \
|
||||
} while (0)
|
||||
int
|
||||
isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, void *writer0)
|
||||
{
|
||||
isc__taskmgr_t * mgr = (isc__taskmgr_t *)mgr0;
|
||||
isc__task_t * task = NULL;
|
||||
int xmlrc;
|
||||
isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, void *writer0) {
|
||||
isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
|
||||
isc__task_t *task = NULL;
|
||||
int xmlrc;
|
||||
xmlTextWriterPtr writer = (xmlTextWriterPtr)writer0;
|
||||
|
||||
LOCK(&mgr->lock);
|
||||
@@ -1932,13 +1886,12 @@ error:
|
||||
} while (0)
|
||||
|
||||
isc_result_t
|
||||
isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, void *tasks0)
|
||||
{
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, void *tasks0) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
|
||||
isc__task_t * task = NULL;
|
||||
json_object * obj = NULL, *array = NULL, *taskobj = NULL;
|
||||
json_object * tasks = (json_object *)tasks0;
|
||||
isc__task_t *task = NULL;
|
||||
json_object *obj = NULL, *array = NULL, *taskobj = NULL;
|
||||
json_object *tasks = (json_object *)tasks0;
|
||||
|
||||
LOCK(&mgr->lock);
|
||||
|
||||
@@ -1974,7 +1927,8 @@ isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, void *tasks0)
|
||||
CHECKMEM(array);
|
||||
|
||||
for (task = ISC_LIST_HEAD(mgr->tasks); task != NULL;
|
||||
task = ISC_LIST_NEXT(task, link)) {
|
||||
task = ISC_LIST_NEXT(task, link))
|
||||
{
|
||||
char buf[255];
|
||||
|
||||
LOCK(&task->lock);
|
||||
@@ -2034,8 +1988,8 @@ error:
|
||||
|
||||
isc_result_t
|
||||
isc_taskmgr_createinctx(isc_mem_t *mctx, unsigned int workers,
|
||||
unsigned int default_quantum, isc_taskmgr_t **managerp)
|
||||
{
|
||||
unsigned int default_quantum,
|
||||
isc_taskmgr_t **managerp) {
|
||||
isc_result_t result;
|
||||
|
||||
result = isc_taskmgr_create(mctx, workers, default_quantum, NULL,
|
||||
|
Reference in New Issue
Block a user