void
dns_adb_beginudpfetch(dns_adb_t *adb, dns_adbaddrinfo_t *addr) {
+ uint_fast32_t active;
+
REQUIRE(DNS_ADB_VALID(adb));
REQUIRE(DNS_ADBADDRINFO_VALID(addr));
- REQUIRE(atomic_fetch_add_relaxed(&addr->entry->active, 1) !=
- UINT32_MAX);
+ active = atomic_fetch_add_relaxed(&addr->entry->active, 1);
+ INSIST(active != UINT32_MAX);
}
void
dns_adb_endudpfetch(dns_adb_t *adb, dns_adbaddrinfo_t *addr) {
+ uint_fast32_t active;
+
REQUIRE(DNS_ADB_VALID(adb));
REQUIRE(DNS_ADBADDRINFO_VALID(addr));
- REQUIRE(atomic_fetch_sub_release(&addr->entry->active, 1) != 0);
+ active = atomic_fetch_sub_release(&addr->entry->active, 1);
+ INSIST(active != 0);
}
isc_stats_t *
case isc_socktype_tcp:
REQUIRE(disp != NULL);
+
LOCK(&disp->lock);
REQUIRE(disp->handle == NULL);
- REQUIRE(atomic_compare_exchange_strong(
+ atomic_compare_exchange_enforced(
&disp->tcpstate,
&(uint_fast32_t){ DNS_DISPATCHSTATE_CONNECTING },
- DNS_DISPATCHSTATE_CONNECTED));
+ DNS_DISPATCHSTATE_CONNECTED);
isc_nmhandle_attach(handle, &disp->handle);
dns_dispatch_attach(disp, &(dns_dispatch_t *){ NULL });
dns_adbfind_t *find = event->ev_sender;
bool want_try = false;
bool want_done = false;
+ uint_fast32_t pending;
REQUIRE(VALID_FCTX(fctx));
FCTXTRACE("finddone");
LOCK(&fctx->bucket->lock);
- INSIST(atomic_fetch_sub_release(&fctx->pending, 1) > 0);
+ pending = atomic_fetch_sub_release(&fctx->pending, 1);
+ INSIST(pending > 0);
if (ADDRWAIT(fctx)) {
/*
isc_sockaddr_t *sa = NULL, *next_sa = NULL;
struct tried *tried = NULL;
fctxbucket_t *bucket = NULL;
+ uint_fast32_t nfctx;
REQUIRE(VALID_FCTX(fctx));
REQUIRE(ISC_LIST_EMPTY(fctx->events));
LOCK(&bucket->lock);
REQUIRE(fctx->state != fetchstate_active);
ISC_LIST_UNLINK(bucket->fctxs, fctx, link);
- INSIST(atomic_fetch_sub_release(&res->nfctx, 1) > 0);
+ nfctx = atomic_fetch_sub_release(&res->nfctx, 1);
+ INSIST(nfctx > 0);
UNLOCK(&bucket->lock);
isc_refcount_destroy(&fctx->references);
isc_interval_t interval;
unsigned int findoptions = 0;
char buf[DNS_NAME_FORMATSIZE + DNS_RDATATYPE_FORMATSIZE + 1];
- size_t p;
int tid = isc_nm_tid();
+ uint_fast32_t nfctx;
+ size_t p;
if (tid == ISC_NETMGR_TID_UNKNOWN) {
tid = 0;
ISC_LIST_APPEND(bucket->fctxs, fctx, link);
- INSIST(atomic_fetch_add_relaxed(&res->nfctx, 1) < UINT32_MAX);
+ nfctx = atomic_fetch_add_relaxed(&res->nfctx, 1);
+ INSIST(nfctx < UINT32_MAX);
inc_stats(res, dns_resstatscounter_nfetch);
res->primefetch = NULL;
UNLOCK(&res->primelock);
- INSIST(atomic_compare_exchange_strong_acq_rel(&res->priming,
- &(bool){ true }, false));
+ atomic_compare_exchange_enforced(&res->priming, &(bool){ true }, false);
if (fevent->result == ISC_R_SUCCESS && res->view->cache != NULL &&
res->view->hints != NULL)
if (result != ISC_R_SUCCESS) {
isc_mem_put(res->mctx, rdataset, sizeof(*rdataset));
- INSIST(atomic_compare_exchange_strong_acq_rel(
- &res->priming, &(bool){ true }, false));
+ atomic_compare_exchange_enforced(
+ &res->priming, &(bool){ true }, false);
}
inc_stats(res, dns_resstatscounter_priming);
}
stub_glue_response_cb, request, &request->request);
if (result != ISC_R_SUCCESS) {
- INSIST(atomic_fetch_sub_release(&args->stub->pending_requests,
- 1) > 1);
+ uint_fast32_t pr;
+ pr = atomic_fetch_sub_release(&args->stub->pending_requests, 1);
+ INSIST(pr > 1);
zone_debuglog(zone, __func__, 1,
"dns_request_createvia() failed: %s",
isc_result_totext(result));
isc_result_t
isc_app_ctxstart(isc_appctx_t *ctx) {
+ int presult;
+ sigset_t sset;
+ char strbuf[ISC_STRERRORSIZE];
+
REQUIRE(VALID_APPCTX(ctx));
/*
atomic_init(&ctx->want_reload, false);
atomic_init(&ctx->blocked, false);
- int presult;
- sigset_t sset;
- char strbuf[ISC_STRERRORSIZE];
-
/*
* Always ignore SIGPIPE.
*/
isc_app_run(void) {
isc_result_t result;
- REQUIRE(atomic_compare_exchange_strong_acq_rel(&is_running,
- &(bool){ false }, true));
+ atomic_compare_exchange_enforced(&is_running, &(bool){ false }, true);
+
result = isc_app_ctxrun(&isc_g_appctx);
atomic_store_release(&is_running, false);
void
isc_app_block(void) {
+ sigset_t sset;
+
REQUIRE(atomic_load_acquire(&isc_g_appctx.running));
- REQUIRE(atomic_compare_exchange_strong_acq_rel(&isc_g_appctx.blocked,
- &(bool){ false }, true));
- sigset_t sset;
+ atomic_compare_exchange_enforced(&isc_g_appctx.blocked,
+ &(bool){ false }, true);
+
blockedthread = pthread_self();
RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
sigaddset(&sset, SIGINT) == 0 &&
void
isc_app_unblock(void) {
- REQUIRE(atomic_load_acquire(&isc_g_appctx.running));
- REQUIRE(atomic_compare_exchange_strong_acq_rel(&isc_g_appctx.blocked,
- &(bool){ true }, false));
+ sigset_t sset;
+ REQUIRE(atomic_load_acquire(&isc_g_appctx.running));
REQUIRE(blockedthread == pthread_self());
- sigset_t sset;
+ atomic_compare_exchange_enforced(&isc_g_appctx.blocked, &(bool){ true },
+ false);
+
RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
sigaddset(&sset, SIGINT) == 0 &&
sigaddset(&sset, SIGTERM) == 0);
#include <isc/stdatomic.h>
#endif
+#include <isc/util.h>
+
/*
* We define a few additional macros to make things easier
*/
#define atomic_compare_exchange_strong_acq_rel(o, e, d) \
atomic_compare_exchange_strong_explicit( \
(o), (e), (d), memory_order_acq_rel, memory_order_acquire)
+
+/* compare/exchange that MUST succeed */
+#define atomic_compare_exchange_enforced(o, e, d) \
+ RUNTIME_CHECK(atomic_compare_exchange_strong((o), (e), (d)))
static void
mem_putstats(isc_mem_t *ctx, void *ptr, size_t size) {
struct stats *stats = stats_bucket(ctx, size);
+ uint_fast32_t s, g;
UNUSED(ptr);
- INSIST(atomic_fetch_sub_release(&ctx->inuse, size) >= size);
+ s = atomic_fetch_sub_release(&ctx->inuse, size);
+ INSIST(s >= size);
- INSIST(atomic_fetch_sub_release(&stats->gets, 1) >= 1);
+ g = atomic_fetch_sub_release(&stats->gets, 1);
+ INSIST(g >= 1);
decrement_malloced(ctx, size);
}
}
UNLOCK(&mgr->lock);
- REQUIRE(atomic_compare_exchange_strong(&mgr->paused, &(bool){ false },
- true));
+ atomic_compare_exchange_enforced(&mgr->paused, &(bool){ false }, true);
}
static void
}
UNLOCK(&mgr->lock);
- REQUIRE(atomic_compare_exchange_strong(&mgr->paused, &(bool){ true },
- false));
+ atomic_compare_exchange_enforced(&mgr->paused, &(bool){ true }, false);
isc__nm_drop_interlocked(mgr);
}
static void
nmhandle_deactivate(isc_nmsocket_t *sock, isc_nmhandle_t *handle) {
bool reuse = false;
+ uint_fast32_t ah;
/*
* We do all of this under lock to avoid races with socket
ISC_LIST_UNLINK(sock->active_handles, handle, active_link);
#endif
- INSIST(atomic_fetch_sub(&sock->ah, 1) > 0);
+ ah = atomic_fetch_sub(&sock->ah, 1);
+ INSIST(ah > 0);
#if !__SANITIZE_ADDRESS__ && !__SANITIZE_THREAD__
if (atomic_load(&sock->active)) {
isc__nmsocket_timer_stop(sock);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- INSIST(atomic_compare_exchange_strong(&sock->connecting,
- &(bool){ true }, false));
+ atomic_compare_exchange_enforced(&sock->connecting, &(bool){ true },
+ false);
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, eresult, async);
/*
* Mark the connection as timed out and shutdown the socket.
*/
-
- INSIST(atomic_compare_exchange_strong(&sock->timedout, &(bool){ false },
- true));
+ atomic_compare_exchange_enforced(&sock->timedout, &(bool){ false },
+ true);
isc__nmsocket_clearcb(sock);
isc__nmsocket_shutdown(sock);
}
result = tlsdns_connect_direct(sock, req);
if (result != ISC_R_SUCCESS) {
- INSIST(atomic_compare_exchange_strong(&sock->connecting,
- &(bool){ true }, false));
+ atomic_compare_exchange_enforced(&sock->connecting,
+ &(bool){ true }, false);
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, true);
atomic_store(&sock->active, false);
sock->tid = isc_nm_tid();
}
- INSIST(atomic_compare_exchange_strong(&sock->connecting,
- &(bool){ true }, false));
+ atomic_compare_exchange_enforced(&sock->connecting, &(bool){ true },
+ false);
isc__nmsocket_clearcb(sock);
isc__nm_connectcb(sock, req, result, true);
atomic_store(&sock->closed, true);
uv_handle_set_data((uv_handle_t *)&sock->read_timer,
sock);
- INSIST(atomic_compare_exchange_strong(
- &sock->connecting, &(bool){ true }, false));
+ atomic_compare_exchange_enforced(
+ &sock->connecting, &(bool){ true }, false);
isc__nm_connectcb(sock, req, ISC_R_SUCCESS, true);
}
async_tlsdns_cycle(sock);
static void
quota_release(isc_quota_t *quota) {
+ uint_fast32_t used;
+
/*
* This is opportunistic - we might race with a failing quota_attach_cb
* and not detect that something is waiting, but eventually someone will
}
}
- INSIST(atomic_fetch_sub_release("a->used, 1) > 0);
+ used = atomic_fetch_sub_release("a->used, 1);
+ INSIST(used > 0);
}
static isc_result_t
void
isc_task_endexclusive(isc_task_t *task) {
- isc_taskmgr_t *manager;
+ isc_taskmgr_t *manager = NULL;
REQUIRE(VALID_TASK(task));
REQUIRE(task->state == task_state_running);
+
manager = task->manager;
if (isc_log_wouldlog(isc_lctx, ISC_LOG_DEBUG(1))) {
"exclusive task mode: %s", "ended");
}
- REQUIRE(atomic_compare_exchange_strong(&manager->exclusive_req,
- &(bool){ true }, false));
+ atomic_compare_exchange_enforced(&manager->exclusive_req,
+ &(bool){ true }, false);
}
#ifdef HAVE_LIBXML2
"seeded' message in the OpenSSL FAQ)");
}
- REQUIRE(atomic_compare_exchange_strong(&init_done, &(bool){ false },
- true));
+ atomic_compare_exchange_enforced(&init_done, &(bool){ false }, true);
}
void
}
#endif
- REQUIRE(atomic_compare_exchange_strong(&shut_done, &(bool){ false },
- true));
+ atomic_compare_exchange_enforced(&shut_done, &(bool){ false }, true);
}
void