void
isc_quota_init(isc_quota_t *quota, unsigned int max) {
- atomic_store("a->max, max);
- atomic_store("a->used, 0);
- atomic_store("a->soft, 0);
+ atomic_init("a->max, max);
+ atomic_init("a->used, 0);
+ atomic_init("a->soft, 0);
}
void
isc_quota_destroy(isc_quota_t *quota) {
INSIST(atomic_load("a->used) == 0);
- atomic_store("a->max, 0);
- atomic_store("a->used, 0);
- atomic_store("a->soft, 0);
+ atomic_store_release("a->max, 0);
+ atomic_store_release("a->used, 0);
+ atomic_store_release("a->soft, 0);
}
void
isc_quota_soft(isc_quota_t *quota, unsigned int soft) {
- atomic_store("a->soft, soft);
+ atomic_store_release("a->soft, soft);
}
void
isc_quota_max(isc_quota_t *quota, unsigned int max) {
- atomic_store("a->max, max);
+ atomic_store_release("a->max, max);
}
unsigned int
isc_result_t
isc_quota_reserve(isc_quota_t *quota) {
isc_result_t result;
- uint32_t max = atomic_load("a->max);
- uint32_t soft = atomic_load("a->soft);
- uint32_t used = atomic_fetch_add("a->used, 1);
+ uint32_t max = atomic_load_acquire("a->max);
+ uint32_t soft = atomic_load_acquire("a->soft);
+ uint32_t used = atomic_fetch_add_relaxed("a->used, 1);
if (max == 0 || used < max) {
if (soft == 0 || used < soft) {
result = ISC_R_SUCCESS;
result = ISC_R_SOFTQUOTA;
}
} else {
- INSIST(atomic_fetch_sub("a->used, 1) > 0);
+ INSIST(atomic_fetch_sub_release("a->used, 1) > 0);
result = ISC_R_QUOTA;
}
return (result);
void
isc_quota_release(isc_quota_t *quota) {
- INSIST(atomic_fetch_sub("a->used, 1) > 0);
+ INSIST(atomic_fetch_sub_release("a->used, 1) > 0);
}
static isc_result_t
*p = quota;
} else if (result == ISC_R_QUOTA && force) {
/* attach anyway */
- atomic_fetch_add("a->used, 1);
+ atomic_fetch_add_relaxed("a->used, 1);
*p = quota;
result = ISC_R_SUCCESS;
}