diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c index e518ab3720..b01d15b58c 100644 --- a/bin/dnssec/dnssec-signzone.c +++ b/bin/dnssec/dnssec-signzone.c @@ -156,8 +156,8 @@ static unsigned char *gsalt = saltbuf; static size_t salt_length = 0; static isc_task_t *master = NULL; static unsigned int ntasks = 0; -static atomic_bool shuttingdown = ATOMIC_VAR_INIT(false); -static atomic_bool finished = ATOMIC_VAR_INIT(false); +static atomic_bool shuttingdown; +static atomic_bool finished; static bool nokeys = false; static bool removefile = false; static bool generateds = false; @@ -3216,6 +3216,9 @@ main(int argc, char *argv[]) { bool set_iter = false; bool nonsecify = false; + atomic_init(&shuttingdown, false); + atomic_init(&finished, false); + /* Unused letters: Bb G J q Yy (and F is reserved). */ #define CMDLINE_FLAGS \ "3:AaCc:Dd:E:e:f:FghH:i:I:j:K:k:L:l:m:M:n:N:o:O:PpQRr:s:ST:tuUv:VX:xzZ:" diff --git a/lib/dns/lib.c b/lib/dns/lib.c index 8d51a0a762..e2b92a99d7 100644 --- a/lib/dns/lib.c +++ b/lib/dns/lib.c @@ -44,7 +44,7 @@ static isc_once_t init_once = ISC_ONCE_INIT; static isc_mem_t *dns_g_mctx = NULL; static dns_dbimplementation_t *dbimp = NULL; static bool initialize_done = false; -static isc_refcount_t references = 0; +static isc_refcount_t references; static void initialize(void) { @@ -52,6 +52,8 @@ initialize(void) { REQUIRE(initialize_done == false); + isc_refcount_init(&references, 0); + result = isc_mem_create(0, 0, &dns_g_mctx); if (result != ISC_R_SUCCESS) return; diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 2af562a5cc..37efaa3af6 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -9814,7 +9814,7 @@ destroy(dns_resolver_t *res) { unsigned int i; alternate_t *a; - REQUIRE(res->references == 0); + REQUIRE(atomic_load(&res->references) == 0); REQUIRE(!res->priming); REQUIRE(res->primefetch == NULL); @@ -10039,7 +10039,7 @@ dns_resolver_create(dns_view_t *view, isc_mem_setname(res->buckets[i].mctx, name, NULL); isc_task_setname(res->buckets[i].task, name, res); ISC_LIST_INIT(res->buckets[i].fctxs); - atomic_store_release(&res->buckets[i].exiting, false); + atomic_init(&res->buckets[i].exiting, false); buckets_created++; } @@ -10362,7 +10362,7 @@ dns_resolver_shutdown(dns_resolver_t *res) { dns_dispatchset_cancelall(res->dispatches6, res->buckets[i].task); } - res->buckets[i].exiting = true; + atomic_store(&res->buckets[i].exiting, true); if (ISC_LIST_EMPTY(res->buckets[i].fctxs)) { INSIST(res->activebuckets > 0); res->activebuckets--; @@ -10583,7 +10583,7 @@ dns_resolver_createfetch(dns_resolver_t *res, const dns_name_t *name, UNLOCK(&res->lock); LOCK(&res->buckets[bucketnum].lock); - if (res->buckets[bucketnum].exiting) { + if (atomic_load(&res->buckets[bucketnum].exiting)) { result = ISC_R_SHUTTINGDOWN; goto unlock; } diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 9706d9e2b2..25c8fcfa2a 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -17392,7 +17392,7 @@ dns_zonemgr_unreachable(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote, RWLOCK(&zmgr->urlock, isc_rwlocktype_read); for (i = 0; i < UNREACH_CACHE_SIZE; i++) { - if (zmgr->unreachable[i].expire >= seconds && + if (atomic_load(&zmgr->unreachable[i].expire) >= seconds && isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) && isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) { atomic_store_relaxed(&zmgr->unreachable[i].last, diff --git a/lib/isc/task.c b/lib/isc/task.c index f0446eafbe..b97ba306b6 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -229,7 +229,7 @@ task_finished(isc__task_t *task) { REQUIRE(EMPTY(task->events)); REQUIRE(task->nevents == 0); REQUIRE(EMPTY(task->on_shutdown)); - REQUIRE(task->references == 0); + REQUIRE(atomic_load(&task->references) == 0); REQUIRE(task->state == task_state_done); XTRACE("task_finished"); @@ -1243,7 +1243,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) { * we're stuck. Automatically drop privileges at that * point and continue with the regular ready queue. */ - if (manager->mode != isc_taskmgrmode_normal && + if (atomic_load_relaxed(&manager->mode) != + isc_taskmgrmode_normal && atomic_load_explicit(&manager->tasks_running, memory_order_acquire) == 0) { @@ -1256,7 +1257,8 @@ dispatch(isc__taskmgr_t *manager, unsigned int threadid) { * we'll end up in a deadlock over queue locks. * */ - if (manager->mode != isc_taskmgrmode_normal && + if (atomic_load(&manager->mode) != + isc_taskmgrmode_normal && atomic_load_explicit(&manager->tasks_running, memory_order_acquire) == 0) { @@ -1360,10 +1362,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers, manager->queues = isc_mem_get(mctx, workers * sizeof(isc__taskqueue_t)); RUNTIME_CHECK(manager->queues != NULL); - manager->tasks_running = 0; - manager->tasks_ready = 0; - manager->curq = 0; - manager->exiting = false; + atomic_init(&manager->tasks_running, 0); + atomic_init(&manager->tasks_ready, 0); + atomic_init(&manager->curq, 0); + atomic_init(&manager->exiting, false); manager->excl = NULL; manager->halted = 0; atomic_store_relaxed(&manager->exclusive_req, false); @@ -1529,8 +1531,8 @@ void isc__taskmgr_resume(isc_taskmgr_t *manager0) { isc__taskmgr_t *manager = (isc__taskmgr_t *)manager0; LOCK(&manager->halt_lock); - if (manager->pause_req) { - manager->pause_req = false; + if (atomic_load(&manager->pause_req)) { + atomic_store(&manager->pause_req, false); while (manager->halted > 0) { BROADCAST(&manager->halt_cond); WAIT(&manager->halt_cond, &manager->halt_lock);