*/
if (fctx->state != fetchstate_init) {
cevent = &fctx->control_event;
- isc_task_send(fctx->res->buckets[fctx->bucketnum].task,
- &cevent);
+ isc_task_sendto(fctx->res->buckets[fctx->bucketnum].task,
+ &cevent, fctx->bucketnum);
}
}
if (result != ISC_R_SUCCESS)
goto cleanup_buckets;
res->buckets[i].task = NULL;
- result = isc_task_create(taskmgr, 0, &res->buckets[i].task);
+ result = isc_task_create_bound(taskmgr, 0, &res->buckets[i].task, i);
if (result != ISC_R_SUCCESS) {
DESTROYLOCK(&res->buckets[i].lock);
goto cleanup_buckets;
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp);
+
+isc_result_t
+isc_task_create_bound(isc_taskmgr_t *manager, unsigned int quantum,
+ isc_task_t **taskp, int threadid);
/*%<
* Create a task.
*
char name[16];
void * tag;
unsigned int threadid;
+ bool bound;
/* Locked by task manager lock. */
LINK(isc__task_t) link;
LINK(isc__task_t) ready_link;
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__taskmgr_t *manager = (isc__taskmgr_t *)manager0;
isc__task_t *task;
return (ISC_R_NOMEMORY);
XTRACE("isc_task_create");
task->manager = manager;
- task->threadid = atomic_fetch_add_explicit(&manager->curq, 1,
- memory_order_relaxed)
- % manager->workers;
+ if (threadid == -1) {
+ task->bound = false;
+ task->threadid = atomic_fetch_add_explicit(&manager->curq, 1,
+ memory_order_relaxed)
+ % manager->workers;
+ } else {
+ task->bound = true;
+ task->threadid = threadid % manager->workers;
+ }
result = isc_mutex_init(&task->lock);
if (result != ISC_R_SUCCESS) {
isc_mem_put(manager->mctx, task, sizeof(*task));
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_send");
- if (c < 0) {
+ if (task->bound) {
+ c = task->threadid;
+ } else if (c < 0) {
c = atomic_fetch_add_explicit(&task->manager->curq, 1,
memory_order_relaxed);
}
REQUIRE(VALID_TASK(task));
XTRACE("isc_task_sendanddetach");
- if (c < 0) {
+ if (task->bound) {
+ c = task->threadid;
+ } else if (c < 0) {
c = atomic_fetch_add_explicit(&task->manager->curq, 1,
memory_order_relaxed);
}