isc_log_setdebuglevel(lctx, 0);
- result = isc_taskmgr_create(mctx, 1, 0, &taskmgr);
+ result = isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr);
check_result(result, "isc_taskmgr_create");
result = isc_task_create(taskmgr, 0, &global_task);
print_time(outfp);
print_version(outfp);
- result = isc_taskmgr_create(mctx, ntasks, 0, &taskmgr);
+ result = isc_taskmgr_create(mctx, ntasks, 0, NULL, &taskmgr);
if (result != ISC_R_SUCCESS)
fatal("failed to create task manager: %s",
isc_result_totext(result));
"using %u UDP listener%s per interface",
named_g_udpdisp, named_g_udpdisp == 1 ? "" : "s");
- result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0,
+ result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0, NULL,
&named_g_taskmgr);
if (result != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
result = isc_timermgr_create(gmctx, &timermgr);
check_result(result, "dns_timermgr_create");
- result = isc_taskmgr_create(gmctx, 1, 0, &taskmgr);
+ result = isc_taskmgr_create(gmctx, 1, 0, NULL, &taskmgr);
check_result(result, "isc_taskmgr_create");
result = isc_task_create(taskmgr, 0, &global_task);
serial = isc_random32();
isc_mem_create(&rndc_mctx);
- DO("create socket manager", isc_socketmgr_create(rndc_mctx, &socketmgr));
- DO("create task manager", isc_taskmgr_create(rndc_mctx, 1, 0, &taskmgr));
+ DO("create socket manager", isc_socketmgr_create(rndc_mctx,
+ &socketmgr));
+ DO("create task manager", isc_taskmgr_create(rndc_mctx, 1, 0,
+ NULL, &taskmgr));
DO("create task", isc_task_create(taskmgr, 0, &task));
- DO("create logging context", isc_log_create(rndc_mctx, &log, &logconfig));
+ DO("create logging context", isc_log_create(rndc_mctx, &log,
+ &logconfig));
isc_log_setcontext(log);
DO("setting log tag", isc_log_settag(logconfig, progname));
logdest.file.stream = stderr;
isc_result_t result;
taskmgr = NULL;
- result = isc_taskmgr_create(mctx, 5, 0, &taskmgr);
+ result = isc_taskmgr_create(mctx, 5, 0, NULL, &taskmgr);
check_result(result, "isc_taskmgr_create");
timermgr = NULL;
}
taskmgr = NULL;
- RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &taskmgr)
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &taskmgr)
== ISC_R_SUCCESS);
task = NULL;
RUNTIME_CHECK(isc_task_create(taskmgr, 0, &task)
}
taskmgr = NULL;
- RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &taskmgr) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &taskmgr) ==
ISC_R_SUCCESS);
task = NULL;
RUNTIME_CHECK(isc_task_create(taskmgr, 0, &task) ==
RUNCHECK(dst_lib_init(mctx, NULL));
taskmgr = NULL;
- RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
+ RUNCHECK(isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr));
task = NULL;
RUNCHECK(isc_task_create(taskmgr, 0, &task));
timermgr = NULL;
isc_interval_set(&linterval, 1, 0);
isc_mem_create(&mctx);
- RUNTIME_CHECK(isc_taskmgr_create(mctx, 3, 0, &taskmgr) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, 3, 0, NULL, &taskmgr) ==
ISC_R_SUCCESS);
RUNTIME_CHECK(isc_timermgr_create(mctx, &timermgr) ==
ISC_R_SUCCESS);
isc_mem_create(&mctx);
mctx2 = NULL;
isc_mem_create(&mctx2);
- RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &task_manager) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &task_manager) ==
ISC_R_SUCCESS);
RUNTIME_CHECK(isc_timermgr_create(mctx, &timer_manager) ==
ISC_R_SUCCESS);
dst_result_register();
taskmgr = NULL;
- RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, &taskmgr) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, NULL, &taskmgr) ==
ISC_R_SUCCESS);
task1 = NULL;
RUNTIME_CHECK(isc_task_create(taskmgr, 0, &task1) == ISC_R_SUCCESS);
* The task manager is independent (other than memory context)
*/
manager = NULL;
- RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &manager) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &manager) ==
ISC_R_SUCCESS);
/*
isc_mem_create(&mctx);
- RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, &manager) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &manager) ==
ISC_R_SUCCESS);
RUNTIME_CHECK(isc_task_create(manager, 0, &t1) == ISC_R_SUCCESS);
printf("%u workers\n", workers);
isc_mem_create(&mctx1);
- RUNTIME_CHECK(isc_taskmgr_create(mctx1, workers, 0, &manager) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx1, workers, 0, NULL, &manager) ==
ISC_R_SUCCESS);
RUNTIME_CHECK(isc_timermgr_create(mctx1, &timgr) == ISC_R_SUCCESS);
RUNTIME_CHECK(isc_app_start() == ISC_R_SUCCESS);
isc_mem_create(&mctx);
- RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, &taskmgr) ==
+ RUNTIME_CHECK(isc_taskmgr_create(mctx, 2, 0, NULL, &taskmgr) ==
ISC_R_SUCCESS);
RUNTIME_CHECK(isc_timermgr_create(mctx, &timermgr) == ISC_R_SUCCESS);
RUNTIME_CHECK(isc_socketmgr_create(mctx, &socketmgr) == ISC_R_SUCCESS);
RUNCHECK(dst_lib_init(mctx, NULL));
taskmgr = NULL;
- RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
+ RUNCHECK(isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr));
task = NULL;
RUNCHECK(isc_task_create(taskmgr, 0, &task));
timermgr = NULL;
RUNCHECK(dst_lib_init(mctx, NULL));
taskmgr = NULL;
- RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
+ RUNCHECK(isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr));
task = NULL;
RUNCHECK(isc_task_create(taskmgr, 0, &task));
timermgr = NULL;
RUNCHECK(dst_lib_init(mctx, NULL));
taskmgr = NULL;
- RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
+ RUNCHECK(isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr));
task = NULL;
RUNCHECK(isc_task_create(taskmgr, 0, &task));
timermgr = NULL;
fatal("can't choose between IPv4 and IPv6");
taskmgr = NULL;
- RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
+ RUNCHECK(isc_taskmgr_create(mctx, 1, 0, NULL, &taskmgr));
task = NULL;
RUNCHECK(isc_task_create(taskmgr, 0, &task));
timermgr = NULL;
isc_result_t result;
ncpus = isc_os_ncpus();
- CHECK(isc_taskmgr_create(dt_mctx, ncpus, 0, &taskmgr));
+ CHECK(isc_taskmgr_create(dt_mctx, ncpus, 0, NULL, &taskmgr));
CHECK(isc_timermgr_create(dt_mctx, &timermgr));
CHECK(isc_socketmgr_create(dt_mctx, &socketmgr));
CHECK(isc_task_create(taskmgr, 0, &maintask));
#include <isc/eventclass.h>
#include <isc/lang.h>
#include <isc/stdtime.h>
+#include <isc/netmgr.h>
#include <isc/types.h>
#define ISC_TASKEVENT_FIRSTEVENT (ISC_EVENTCLASS_TASK + 0)
* task. Waits for any other concurrently executing tasks to finish their
* current event, and prevents any new events from executing in any of the
* tasks sharing a task manager with 'task'.
+ * It also pauses processing of network events in netmgr if it was provided
+ * when taskmgr was created.
*
* The exclusive access must be relinquished by calling
* isc_task_endexclusive() before returning from the current event handler.
isc_taskmgr_t **managerp);
isc_result_t
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
- unsigned int default_quantum, isc_taskmgr_t **managerp);
+ unsigned int default_quantum,
+ isc_nm_t *nm, isc_taskmgr_t **managerp);
/*%<
* Create a new task manager. isc_taskmgr_createinctx() also associates
* the new manager with the specified application context.
* quantum value when tasks are created. If zero, then an implementation
* defined default quantum will be used.
*
+ *\li If 'nm' is set then netmgr is paused when an exclusive task mode
+ * is requested.
+ *
* Requires:
*
*\li 'mctx' is a valid memory context.
atomic_uint_fast32_t curq;
atomic_uint_fast32_t tasks_count;
isc__taskqueue_t *queues;
+ isc_nm_t *nm;
/* Locked by task manager lock. */
unsigned int default_quantum;
LOCK(&manager->queues[task->threadid].lock);
push_readyq(manager, task, task->threadid);
if (atomic_load(&manager->mode) == isc_taskmgrmode_normal ||
- has_privilege) {
+ has_privilege)
+ {
SIGNAL(&manager->queues[task->threadid].work_available);
}
UNLOCK(&manager->queues[task->threadid].lock);
isc_result_t
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
- unsigned int default_quantum, isc_taskmgr_t **managerp)
+ unsigned int default_quantum,
+ isc_nm_t *nm, isc_taskmgr_t **managerp)
{
unsigned int i;
isc__taskmgr_t *manager;
default_quantum = DEFAULT_DEFAULT_QUANTUM;
}
manager->default_quantum = default_quantum;
+
+ if (nm != NULL) {
+ isc_nm_attach(nm, &manager->nm);
+ }
+
INIT_LIST(manager->tasks);
atomic_store(&manager->tasks_count, 0);
manager->queues = isc_mem_get(mctx,
isc_thread_join(manager->queues[i].thread, NULL);
}
+ /*
+ * Detach from the network manager if it was set.
+ */
+ if (manager->nm != NULL) {
+ isc_nm_detach(&manager->nm);
+ }
+
manager_free(manager);
*managerp = NULL;
WAIT(&manager->halt_cond, &manager->halt_lock);
}
UNLOCK(&manager->halt_lock);
+ if (manager->nm != NULL) {
+ isc_nm_pause(manager->nm);
+ }
return (ISC_R_SUCCESS);
}
REQUIRE(VALID_TASK(task));
REQUIRE(task->state == task_state_running);
-
manager = task->manager;
+ if (manager->nm != NULL) {
+ isc_nm_resume(manager->nm);
+ }
LOCK(&manager->halt_lock);
REQUIRE(atomic_load_relaxed(&manager->exclusive_req) == true);
atomic_store_relaxed(&manager->exclusive_req, false);
{
isc_result_t result;
- result = isc_taskmgr_create(mctx, workers, default_quantum,
- managerp);
+ result = isc_taskmgr_create(mctx, workers, default_quantum, NULL,
+ managerp);
return (result);
}
workers = atoi(p);
}
- CHECK(isc_taskmgr_create(mctx, workers, 0, &taskmgr));
+ CHECK(isc_taskmgr_create(mctx, workers, 0, NULL, &taskmgr));
CHECK(isc_task_create(taskmgr, 0, &maintask));
isc_taskmgr_setexcltask(taskmgr, maintask);
isc_mem_debugging = ISC_MEM_DEBUGRECORD;
isc_mem_create(&mctx);
- result = isc_taskmgr_create(mctx, 4, 0, &taskmgr);
+ result = isc_taskmgr_create(mctx, 4, 0, NULL, &taskmgr);
assert_int_equal(result, ISC_R_SUCCESS);
atomic_init(&done, false);
isc_task_getcurrenttime
isc_task_getcurrenttimex
isc_task_onshutdown
+isc_task_pause
isc_task_privilege
isc_task_purge
isc_task_purgeevent
isc_task_setname
isc_task_setprivilege
isc_task_shutdown
+isc_task_unpause
isc_task_unsend
isc_taskmgr_create
isc_taskmgr_createinctx
isc_event_t *event = NULL;
ncpus = isc_os_ncpus();
- CHECK(isc_taskmgr_create(mctx, ncpus, 0, &taskmgr));
+ CHECK(isc_taskmgr_create(mctx, ncpus, 0, NULL, &taskmgr));
CHECK(isc_task_create(taskmgr, 0, &maintask));
isc_taskmgr_setexcltask(taskmgr, maintask);
CHECK(isc_task_onshutdown(maintask, shutdown_managers, NULL));