Lines Matching refs:quota
1 /* $NetBSD: quota.c,v 1.1 2024/02/18 20:57:50 christos Exp $ */
21 #include <isc/quota.h>
31 isc_quota_init(isc_quota_t *quota, unsigned int max) {
32 atomic_init("a->max, max);
33 atomic_init("a->used, 0);
34 atomic_init("a->soft, 0);
35 atomic_init("a->waiting, 0);
36 ISC_LIST_INIT(quota->cbs);
37 isc_mutex_init("a->cblock);
38 quota->magic = QUOTA_MAGIC;
42 isc_quota_destroy(isc_quota_t *quota) {
43 REQUIRE(VALID_QUOTA(quota));
44 quota->magic = 0;
46 INSIST(atomic_load("a->used) == 0);
47 INSIST(atomic_load("a->waiting) == 0);
48 INSIST(ISC_LIST_EMPTY(quota->cbs));
49 atomic_store_release("a->max, 0);
50 atomic_store_release("a->used, 0);
51 atomic_store_release("a->soft, 0);
52 isc_mutex_destroy("a->cblock);
56 isc_quota_soft(isc_quota_t *quota, unsigned int soft) {
57 REQUIRE(VALID_QUOTA(quota));
58 atomic_store_release("a->soft, soft);
62 isc_quota_max(isc_quota_t *quota, unsigned int max) {
63 REQUIRE(VALID_QUOTA(quota));
64 atomic_store_release("a->max, max);
68 isc_quota_getmax(isc_quota_t *quota) {
69 REQUIRE(VALID_QUOTA(quota));
70 return (atomic_load_relaxed("a->max));
74 isc_quota_getsoft(isc_quota_t *quota) {
75 REQUIRE(VALID_QUOTA(quota));
76 return (atomic_load_relaxed("a->soft));
80 isc_quota_getused(isc_quota_t *quota) {
81 REQUIRE(VALID_QUOTA(quota));
82 return (atomic_load_relaxed("a->used));
86 quota_reserve(isc_quota_t *quota) {
88 uint_fast32_t max = atomic_load_acquire("a->max);
89 uint_fast32_t soft = atomic_load_acquire("a->soft);
90 uint_fast32_t used = atomic_load_acquire("a->used);
100 } while (!atomic_compare_exchange_weak_acq_rel("a->used, &used,
105 /* Must be quota->cbslock locked */
107 enqueue(isc_quota_t *quota, isc_quota_cb_t *cb) {
109 ISC_LIST_ENQUEUE(quota->cbs, cb, link);
110 atomic_fetch_add_release("a->waiting, 1);
113 /* Must be quota->cbslock locked */
115 dequeue(isc_quota_t *quota) {
116 isc_quota_cb_t *cb = ISC_LIST_HEAD(quota->cbs);
118 ISC_LIST_DEQUEUE(quota->cbs, cb, link);
119 atomic_fetch_sub_relaxed("a->waiting, 1);
124 quota_release(isc_quota_t *quota) {
128 * be releasing quota and will detect it, so we don't need to worry -
132 if (atomic_load_acquire("a->waiting) > 0) {
134 LOCK("a->cblock);
135 if (atomic_load_relaxed("a->waiting) > 0) {
136 cb = dequeue(quota);
138 UNLOCK("a->cblock);
140 cb->cb_func(quota, cb->data);
145 INSIST(atomic_fetch_sub_release("a->used, 1) > 0);
149 doattach(isc_quota_t *quota, isc_quota_t **p) {
153 result = quota_reserve(quota);
155 *p = quota;
162 isc_quota_attach(isc_quota_t *quota, isc_quota_t **quotap) {
163 REQUIRE(VALID_QUOTA(quota));
166 return (isc_quota_attach_cb(quota, quotap, NULL));
170 isc_quota_attach_cb(isc_quota_t *quota, isc_quota_t **quotap,
172 REQUIRE(VALID_QUOTA(quota));
176 isc_result_t result = doattach(quota, quotap);
178 LOCK("a->cblock);
179 enqueue(quota, cb);
180 UNLOCK("a->cblock);
196 isc_quota_t *quota = *quotap;
199 quota_release(quota);