]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use atomic_bool for variables shared among threads to make zt_test.c thread-safe
authorOndřej Surý <ondrej@sury.org>
Thu, 4 Jul 2019 09:04:52 +0000 (11:04 +0200)
committerOndřej Surý <ondrej@sury.org>
Mon, 18 Nov 2019 00:39:12 +0000 (08:39 +0800)
lib/dns/tests/zt_test.c

index ede2977341868b74cf17a3efc56f07ffba65fa37..77d36a94f2b77e94ee99c96ccd3d01a0516441c0 100644 (file)
@@ -25,6 +25,7 @@
 #include <cmocka.h>
 
 #include <isc/app.h>
+#include <isc/atomic.h>
 #include <isc/buffer.h>
 #include <isc/print.h>
 #include <isc/task.h>
@@ -79,21 +80,21 @@ count_zone(dns_zone_t *zone, void *uap) {
 static isc_result_t
 load_done(dns_zt_t *zt, dns_zone_t *zone, isc_task_t *task) {
        /* We treat zt as a pointer to a boolean for testing purposes */
-       bool *done = (bool *) zt;
+       atomic_bool *done = (atomic_bool *) zt;
 
        UNUSED(zone);
        UNUSED(task);
 
-       *done = true;
+       atomic_store(done, true);
        isc_app_shutdown();
        return (ISC_R_SUCCESS);
 }
 
 static isc_result_t
 all_done(void *arg) {
-       bool *done = (bool *) arg;
+       atomic_bool *done = (atomic_bool *) arg;
 
-       *done = true;
+       atomic_store(done, true);
        isc_app_shutdown();
        return (ISC_R_SUCCESS);
 }
@@ -164,7 +165,7 @@ asyncload_zone(void **state) {
        dns_db_t *db = NULL;
        FILE* zonefile, *origfile;
        char buf[4096];
-       bool done = false;
+       atomic_bool done = ATOMIC_VAR_INIT(false);
        int i = 0;
        struct args args;
 
@@ -182,7 +183,7 @@ asyncload_zone(void **state) {
        assert_non_null(view->zonetable);
 
        assert_false(dns__zone_loadpending(zone));
-       assert_false(done);
+       assert_false(atomic_load(&done));
        zonefile = fopen("./zone.data", "wb");
        assert_non_null(zonefile);
        origfile = fopen("./testdata/zt/zone1.db", "r+b");
@@ -203,7 +204,7 @@ asyncload_zone(void **state) {
        isc_app_run();
        while (dns__zone_loadpending(zone) && i++ < 5000)
                dns_test_nap(1000);
-       assert_true(done);
+       assert_true(atomic_load(&done));
        /* The zone should now be loaded; test it */
        result = dns_zone_getdb(zone, &db);
        assert_int_equal(result, ISC_R_SUCCESS);
@@ -225,7 +226,7 @@ asyncload_zone(void **state) {
 
        while (dns__zone_loadpending(zone) && i++ < 5000)
                dns_test_nap(1000);
-       assert_true(done);
+       assert_true(atomic_load(&done));
        /* The zone should now be loaded; test it */
        result = dns_zone_getdb(zone, &db);
        assert_int_equal(result, ISC_R_SUCCESS);
@@ -241,7 +242,7 @@ asyncload_zone(void **state) {
 
        while (dns__zone_loadpending(zone) && i++ < 5000)
                dns_test_nap(1000);
-       assert_true(done);
+       assert_true(atomic_load(&done));
        /* The zone should now be loaded; test it */
        result = dns_zone_getdb(zone, &db);
        assert_int_equal(result, ISC_R_SUCCESS);
@@ -265,7 +266,7 @@ asyncload_zt(void **state) {
        dns_view_t *view;
        dns_zt_t *zt = NULL;
        dns_db_t *db = NULL;
-       bool done = false;
+       atomic_bool done = ATOMIC_VAR_INIT(false);
        int i = 0;
        struct args args;
 
@@ -302,16 +303,17 @@ asyncload_zt(void **state) {
 
        assert_false(dns__zone_loadpending(zone1));
        assert_false(dns__zone_loadpending(zone2));
-       assert_false(done);
+       assert_false(atomic_load(&done));
 
        args.arg1 = zt;
        args.arg2 = &done;
        isc_app_onrun(dt_mctx, maintask, start_zt_asyncload, &args);
 
        isc_app_run();
-       while (!done && i++ < 5000)
+       while (!atomic_load(&done) && i++ < 5000) {
                dns_test_nap(1000);
-       assert_true(done);
+       }
+       assert_true(atomic_load(&done));
 
        /* Both zones should now be loaded; test them */
        result = dns_zone_getdb(zone1, &db);