Lines Matching refs:rl

58 	isc_ratelimiter_t *rl;  in isc_ratelimiter_create()  local
61 rl = isc_mem_get(mctx, sizeof(*rl)); in isc_ratelimiter_create()
62 *rl = (isc_ratelimiter_t){ in isc_ratelimiter_create()
69 isc_refcount_init(&rl->references, 1); in isc_ratelimiter_create()
70 isc_interval_set(&rl->interval, 0, 0); in isc_ratelimiter_create()
71 ISC_LIST_INIT(rl->pending); in isc_ratelimiter_create()
73 isc_mutex_init(&rl->lock); in isc_ratelimiter_create()
76 rl->task, ratelimiter_tick, rl, &rl->timer); in isc_ratelimiter_create()
85 isc_refcount_increment(&rl->references); in isc_ratelimiter_create()
87 ISC_EVENT_INIT(&rl->shutdownevent, sizeof(isc_event_t), 0, NULL, in isc_ratelimiter_create()
89 ratelimiter_shutdowncomplete, rl, rl, NULL, NULL); in isc_ratelimiter_create()
91 *ratelimiterp = rl; in isc_ratelimiter_create()
95 isc_refcount_decrementz(&rl->references); in isc_ratelimiter_create()
96 isc_refcount_destroy(&rl->references); in isc_ratelimiter_create()
97 isc_mutex_destroy(&rl->lock); in isc_ratelimiter_create()
98 isc_mem_put(mctx, rl, sizeof(*rl)); in isc_ratelimiter_create()
103 isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) { in isc_ratelimiter_setinterval() argument
106 REQUIRE(rl != NULL); in isc_ratelimiter_setinterval()
109 LOCK(&rl->lock); in isc_ratelimiter_setinterval()
110 rl->interval = *interval; in isc_ratelimiter_setinterval()
114 if (rl->state == isc_ratelimiter_ratelimited) { in isc_ratelimiter_setinterval()
115 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL, in isc_ratelimiter_setinterval()
116 &rl->interval, false); in isc_ratelimiter_setinterval()
118 UNLOCK(&rl->lock); in isc_ratelimiter_setinterval()
123 isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, uint32_t pertic) { in isc_ratelimiter_setpertic() argument
124 REQUIRE(rl != NULL); in isc_ratelimiter_setpertic()
129 rl->pertic = pertic; in isc_ratelimiter_setpertic()
133 isc_ratelimiter_setpushpop(isc_ratelimiter_t *rl, bool pushpop) { in isc_ratelimiter_setpushpop() argument
134 REQUIRE(rl != NULL); in isc_ratelimiter_setpushpop()
136 rl->pushpop = pushpop; in isc_ratelimiter_setpushpop()
140 isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task, in isc_ratelimiter_enqueue() argument
145 REQUIRE(rl != NULL); in isc_ratelimiter_enqueue()
151 LOCK(&rl->lock); in isc_ratelimiter_enqueue()
152 if (rl->state == isc_ratelimiter_ratelimited || in isc_ratelimiter_enqueue()
153 rl->state == isc_ratelimiter_stalled) in isc_ratelimiter_enqueue()
157 if (rl->pushpop) { in isc_ratelimiter_enqueue()
158 ISC_LIST_PREPEND(rl->pending, ev, ev_ratelink); in isc_ratelimiter_enqueue()
160 ISC_LIST_APPEND(rl->pending, ev, ev_ratelink); in isc_ratelimiter_enqueue()
162 } else if (rl->state == isc_ratelimiter_idle) { in isc_ratelimiter_enqueue()
163 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL, in isc_ratelimiter_enqueue()
164 &rl->interval, false); in isc_ratelimiter_enqueue()
167 rl->state = isc_ratelimiter_ratelimited; in isc_ratelimiter_enqueue()
170 INSIST(rl->state == isc_ratelimiter_shuttingdown); in isc_ratelimiter_enqueue()
173 UNLOCK(&rl->lock); in isc_ratelimiter_enqueue()
181 isc_ratelimiter_dequeue(isc_ratelimiter_t *rl, isc_event_t *event) { in isc_ratelimiter_dequeue() argument
184 REQUIRE(rl != NULL); in isc_ratelimiter_dequeue()
187 LOCK(&rl->lock); in isc_ratelimiter_dequeue()
189 ISC_LIST_UNLINK(rl->pending, event, ev_ratelink); in isc_ratelimiter_dequeue()
194 UNLOCK(&rl->lock); in isc_ratelimiter_dequeue()
200 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg; in ratelimiter_tick() local
208 pertic = rl->pertic; in ratelimiter_tick()
211 LOCK(&rl->lock); in ratelimiter_tick()
212 p = ISC_LIST_HEAD(rl->pending); in ratelimiter_tick()
217 ISC_LIST_UNLINK(rl->pending, p, ev_ratelink); in ratelimiter_tick()
224 rl->timer, isc_timertype_inactive, NULL, NULL, in ratelimiter_tick()
227 rl->state = isc_ratelimiter_idle; in ratelimiter_tick()
230 UNLOCK(&rl->lock); in ratelimiter_tick()
240 isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) { in isc_ratelimiter_shutdown() argument
244 REQUIRE(rl != NULL); in isc_ratelimiter_shutdown()
246 LOCK(&rl->lock); in isc_ratelimiter_shutdown()
247 rl->state = isc_ratelimiter_shuttingdown; in isc_ratelimiter_shutdown()
248 (void)isc_timer_reset(rl->timer, isc_timertype_inactive, NULL, NULL, in isc_ratelimiter_shutdown()
250 while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) { in isc_ratelimiter_shutdown()
252 ISC_LIST_UNLINK(rl->pending, ev, ev_ratelink); in isc_ratelimiter_shutdown()
257 isc_task_attach(rl->task, &task); in isc_ratelimiter_shutdown()
258 isc_timer_detach(&rl->timer); in isc_ratelimiter_shutdown()
264 ev = &rl->shutdownevent; in isc_ratelimiter_shutdown()
265 isc_task_send(rl->task, &ev); in isc_ratelimiter_shutdown()
267 UNLOCK(&rl->lock); in isc_ratelimiter_shutdown()
272 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg; in ratelimiter_shutdowncomplete() local
276 isc_ratelimiter_detach(&rl); in ratelimiter_shutdowncomplete()
281 ratelimiter_free(isc_ratelimiter_t *rl) { in ratelimiter_free() argument
282 isc_refcount_destroy(&rl->references); in ratelimiter_free()
283 isc_mutex_destroy(&rl->lock); in ratelimiter_free()
284 isc_mem_put(rl->mctx, rl, sizeof(*rl)); in ratelimiter_free()
299 isc_ratelimiter_t *rl; in isc_ratelimiter_detach() local
303 rl = *rlp; in isc_ratelimiter_detach()
306 if (isc_refcount_decrement(&rl->references) == 1) { in isc_ratelimiter_detach()
307 ratelimiter_free(rl); in isc_ratelimiter_detach()
312 isc_ratelimiter_stall(isc_ratelimiter_t *rl) { in isc_ratelimiter_stall() argument
315 REQUIRE(rl != NULL); in isc_ratelimiter_stall()
317 LOCK(&rl->lock); in isc_ratelimiter_stall()
318 switch (rl->state) { in isc_ratelimiter_stall()
323 result = isc_timer_reset(rl->timer, isc_timertype_inactive, in isc_ratelimiter_stall()
329 rl->state = isc_ratelimiter_stalled; in isc_ratelimiter_stall()
332 UNLOCK(&rl->lock); in isc_ratelimiter_stall()
337 isc_ratelimiter_release(isc_ratelimiter_t *rl) { in isc_ratelimiter_release() argument
340 REQUIRE(rl != NULL); in isc_ratelimiter_release()
342 LOCK(&rl->lock); in isc_ratelimiter_release()
343 switch (rl->state) { in isc_ratelimiter_release()
348 if (!ISC_LIST_EMPTY(rl->pending)) { in isc_ratelimiter_release()
349 result = isc_timer_reset(rl->timer, in isc_ratelimiter_release()
351 &rl->interval, false); in isc_ratelimiter_release()
353 rl->state = isc_ratelimiter_ratelimited; in isc_ratelimiter_release()
356 rl->state = isc_ratelimiter_idle; in isc_ratelimiter_release()
363 UNLOCK(&rl->lock); in isc_ratelimiter_release()