]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
optionally associate a netmgr with a task manager when creating
authorEvan Hunt <each@isc.org>
Tue, 5 Nov 2019 23:23:33 +0000 (15:23 -0800)
committerEvan Hunt <each@isc.org>
Thu, 7 Nov 2019 19:55:37 +0000 (11:55 -0800)
When a task manager is created, we can now specify an `isc_nm`
object to associate with it; thereafter when the task manager is
placed into exclusive mode, the network manager will be paused.

27 files changed:
bin/dig/dighost.c
bin/dnssec/dnssec-signzone.c
bin/named/main.c
bin/nsupdate/nsupdate.c
bin/rndc/rndc.c
bin/tests/optional/adb_test.c
bin/tests/optional/byaddr_test.c
bin/tests/optional/byname_test.c
bin/tests/optional/gsstest.c
bin/tests/optional/ratelimiter_test.c
bin/tests/optional/shutdown_test.c
bin/tests/optional/sig0_test.c
bin/tests/optional/sock_test.c
bin/tests/optional/task_test.c
bin/tests/optional/timer_test.c
bin/tests/optional/zone_test.c
bin/tests/system/pipelined/pipequeries.c
bin/tests/system/tkey/keycreate.c
bin/tests/system/tkey/keydelete.c
bin/tools/mdig.c
lib/dns/tests/dnstest.c
lib/isc/include/isc/task.h
lib/isc/task.c
lib/isc/tests/isctest.c
lib/isc/tests/task_test.c
lib/isc/win32/libisc.def.in
lib/ns/tests/nstest.c

index e2018a7af7d5f220ca6bb076feb85e170e5fc576..bc712a1ad015886f1f415add888eeb0eb0801a93 100644 (file)
@@ -1379,7 +1379,7 @@ setup_libs(void) {
 
        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);
index 5703dde634aec77cc12e50fe2a2985c29a243200..ff87a48469a1cdb81b592fb7838890e90bac80eb 100644 (file)
@@ -3797,7 +3797,7 @@ main(int argc, char *argv[]) {
        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));
index 909b3ad52d4b047242dc4488ca53ddeb6bfee73b..21959ee756ec76a35a6ed19a32b4b93feb314618 100644 (file)
@@ -897,7 +897,7 @@ create_managers(void) {
                      "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__,
index b5cb8f3976d4d11e8c60646ae906b6b50d171909..a272b14a0f86f29d1c92af6f1afc68893bac3d83 100644 (file)
@@ -906,7 +906,7 @@ setup_system(void) {
        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);
index 149f58ef97779524a50602e3d06ae3a1f6450dd8..d9f32a4507a2c9a721357a9b18aeceede5369f56 100644 (file)
@@ -936,11 +936,14 @@ main(int argc, char **argv) {
        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;
index 1dcdeff0fda407833ef11291f2db43d10da885de..73d9cd587e6045cf15eeb4c8b49b3bdde9630e50 100644 (file)
@@ -144,7 +144,7 @@ create_managers(void) {
        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;
index b72f5087088dcdc0abfd247a9f231e83c81ccf3f..036ee961bd81c50b81891286747c6d78ce2b436a 100644 (file)
@@ -112,7 +112,7 @@ main(int argc, char *argv[]) {
        }
 
        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)
index ccff87a5fee8a2c789046d3b676e9aa4528d98d4..fe0d2d7b5a3480c6b032d32ed4e0b70987da0b3a 100644 (file)
@@ -226,7 +226,7 @@ main(int argc, char *argv[]) {
        }
 
        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) ==
index 49f0a507d3b690df01276df203c5ce8f0ab80677..f708316a003e0d6aacbe97236ee21b483a9e202f 100644 (file)
@@ -470,7 +470,7 @@ main(int argc, char *argv[]) {
        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;
index 5bb0f081a680f11b11a2e044de1d9487d4c22616..59c1698295f492f27fc207f698a46ed220e05f2d 100644 (file)
@@ -102,7 +102,7 @@ main(int argc, char *argv[]) {
        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);
index 6c533dc99292ce53951c3a23341ab445c1e0ba63..63331c436015d246c12b0411465000a4b1a664e9 100644 (file)
@@ -181,7 +181,7 @@ main(int argc, char *argv[]) {
        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);
index 175edd80cdf22ca0f425f8ca2eb59fd56ca4398b..72c5c23db1cf4a8f1602eeb7a50bcabf5a7ecf26 100644 (file)
@@ -226,7 +226,7 @@ main(int argc, char *argv[]) {
        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);
index 15ea571c2c6b10b850f0478cad1efe31231f931b..f242638bad34634d11f009c47d4f56eb90cfbf2b 100644 (file)
@@ -292,7 +292,7 @@ main(int argc, char *argv[]) {
         * 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);
 
        /*
index 9a680c0cc7b6b618fc66c9f3021195a86433a161..0e848aeda71896c87ebd006945d447e5698ba148 100644 (file)
@@ -79,7 +79,7 @@ main(int argc, char *argv[]) {
 
        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);
index 6122aca33e8329119e98930b7c855082ed69f36c..61f7b64a8fde5dfad0bc253f859fe43746bc4930 100644 (file)
@@ -108,7 +108,7 @@ main(int argc, char *argv[]) {
        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);
 
index 914a4341f2dfe37bb9daccb8e3f856d622d2e893..641533c8f503e85570490abce957ba0387781ec2 100644 (file)
@@ -280,7 +280,7 @@ main(int argc, char **argv) {
 
        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);
index f04b7f0c04916c994e5b35f748b42fc119d4bbda..8af1b8985ea40f869669bf7ec00b2119adb1004a 100644 (file)
@@ -277,7 +277,7 @@ main(int argc, char *argv[]) {
        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;
index 9ccb24ff3281a8d88ea4f26a3bbba19cb0ed435a..e8c8811655e1d4aca75afe66a7a81e3541f53a58 100644 (file)
@@ -236,7 +236,7 @@ main(int argc, char *argv[]) {
        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;
index c96d38950c8c4561a0268cfccd7c08147a24b6ba..bc3a8d5539096d4290a7877c31ed3e6d9b9215f2 100644 (file)
@@ -175,7 +175,7 @@ main(int argc, char **argv) {
        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;
index a4e6968bf8e4b8301ae2f91cc16d113d2b083436..bf889228e4ac0f017bca112ec423a9e19eb5f83d 100644 (file)
@@ -2047,7 +2047,7 @@ main(int argc, char *argv[]) {
                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;
index 539e6439e7b377a3055512ecffc7833a8fdeac78..ad525cebe0fa3e9e0e44d5ad810314bf554c7fd8 100644 (file)
@@ -116,7 +116,7 @@ create_managers(void) {
        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));
index 10e8948268d347c94203a6185d4558163c0b43c2..b2d931ef369421ed92aad511500f0f0aa97d2024 100644 (file)
@@ -78,6 +78,7 @@
 #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)
@@ -544,6 +545,8 @@ isc_task_beginexclusive(isc_task_t *task);
  * 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.
@@ -633,7 +636,8 @@ isc_taskmgr_createinctx(isc_mem_t *mctx,
                        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.
@@ -650,6 +654,9 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
  *     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.
index f921b5952ee49d6f94512540abc083373db107f1..538fde35b6eb77f22b68d03ff98cc0ca0574d8cf 100644 (file)
@@ -155,6 +155,7 @@ struct isc__taskmgr {
        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;
@@ -405,7 +406,8 @@ task_ready(isc__task_t *task) {
        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);
@@ -1323,7 +1325,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_taskmgr_t **managerp)
+                   unsigned int default_quantum,
+                   isc_nm_t *nm, isc_taskmgr_t **managerp)
 {
        unsigned int i;
        isc__taskmgr_t *manager;
@@ -1354,6 +1357,11 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
                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,
@@ -1484,6 +1492,13 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
                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;
@@ -1600,6 +1615,9 @@ isc_task_beginexclusive(isc_task_t *task0) {
                WAIT(&manager->halt_cond, &manager->halt_lock);
        }
        UNLOCK(&manager->halt_lock);
+       if (manager->nm != NULL) {
+               isc_nm_pause(manager->nm);
+       }
        return (ISC_R_SUCCESS);
 }
 
@@ -1610,9 +1628,11 @@ isc_task_endexclusive(isc_task_t *task0) {
 
        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);
@@ -1888,8 +1908,8 @@ isc_taskmgr_createinctx(isc_mem_t *mctx,
 {
        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);
 }
index 050e4809c22b9fa3992afe0e17fe341a24a61943..08ced36b303cbbce5210ef39076d3ad07fd4fcd0 100644 (file)
@@ -88,7 +88,7 @@ create_managers(unsigned int workers) {
                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);
 
index 282dab035b5c06efb7adc6513bce8e1dbd4b930d..9b15897a94d6efa007a59aade23f36148527b549 100644 (file)
@@ -734,7 +734,7 @@ manytasks(void **state) {
        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);
index ba50ba1e752f4f46c53bd29f73e593d2ebacf16c..9b3a45d45e9a7d027ad0c6ac0e6823d661b5b041 100644 (file)
@@ -611,6 +611,7 @@ isc_task_exiting
 isc_task_getcurrenttime
 isc_task_getcurrenttimex
 isc_task_onshutdown
+isc_task_pause
 isc_task_privilege
 isc_task_purge
 isc_task_purgeevent
@@ -622,6 +623,7 @@ isc_task_sendtoanddetach
 isc_task_setname
 isc_task_setprivilege
 isc_task_shutdown
+isc_task_unpause
 isc_task_unsend
 isc_taskmgr_create
 isc_taskmgr_createinctx
index e2ff80785e1ba188892faad7ab978f61c589c08c..cf7f00256e231acdf73ac4743e17cb25ee9871ef 100644 (file)
@@ -177,7 +177,7 @@ create_managers(void) {
        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));