Home | History | Annotate | Download | only in isc

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(&quota->max, max);
33 atomic_init(&quota->used, 0);
34 atomic_init(&quota->soft, 0);
35 atomic_init(&quota->waiting, 0);
36 ISC_LIST_INIT(quota->cbs);
37 isc_mutex_init(&quota->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(&quota->used) == 0);
47 INSIST(atomic_load(&quota->waiting) == 0);
48 INSIST(ISC_LIST_EMPTY(quota->cbs));
49 atomic_store_release(&quota->max, 0);
50 atomic_store_release(&quota->used, 0);
51 atomic_store_release(&quota->soft, 0);
52 isc_mutex_destroy(&quota->cblock);
56 isc_quota_soft(isc_quota_t *quota, unsigned int soft) {
57 REQUIRE(VALID_QUOTA(quota));
58 atomic_store_release(&quota->soft, soft);
62 isc_quota_max(isc_quota_t *quota, unsigned int max) {
63 REQUIRE(VALID_QUOTA(quota));
64 atomic_store_release(&quota->max, max);
68 isc_quota_getmax(isc_quota_t *quota) {
69 REQUIRE(VALID_QUOTA(quota));
70 return (atomic_load_relaxed(&quota->max));
74 isc_quota_getsoft(isc_quota_t *quota) {
75 REQUIRE(VALID_QUOTA(quota));
76 return (atomic_load_relaxed(&quota->soft));
80 isc_quota_getused(isc_quota_t *quota) {
81 REQUIRE(VALID_QUOTA(quota));
82 return (atomic_load_relaxed(&quota->used));
86 quota_reserve(isc_quota_t *quota) {
88 uint_fast32_t max = atomic_load_acquire(&quota->max);
89 uint_fast32_t soft = atomic_load_acquire(&quota->soft);
90 uint_fast32_t used = atomic_load_acquire(&quota->used);
100 } while (!atomic_compare_exchange_weak_acq_rel(&quota->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(&quota->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(&quota->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(&quota->waiting) > 0) {
134 LOCK(&quota->cblock);
135 if (atomic_load_relaxed(&quota->waiting) > 0) {
136 cb = dequeue(quota);
138 UNLOCK(&quota->cblock);
140 cb->cb_func(quota, cb->data);
145 INSIST(atomic_fetch_sub_release(&quota->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(&quota->cblock);
179 enqueue(quota, cb);
180 UNLOCK(&quota->cblock);
196 isc_quota_t *quota = *quotap;
199 quota_release(quota);