Lines Matching refs:rl

66 	isc_ratelimiter_t *rl;
69 rl = isc_mem_get(mctx, sizeof(*rl));
70 if (rl == NULL)
72 rl->mctx = mctx;
73 rl->refs = 1;
74 rl->task = task;
75 isc_interval_set(&rl->interval, 0, 0);
76 rl->timer = NULL;
77 rl->pertic = 1;
78 rl->state = isc_ratelimiter_idle;
79 ISC_LIST_INIT(rl->pending);
81 result = isc_mutex_init(&rl->lock);
85 NULL, NULL, rl->task, ratelimiter_tick,
86 rl, &rl->timer);
94 rl->refs++;
96 ISC_EVENT_INIT(&rl->shutdownevent,
99 ratelimiter_shutdowncomplete, rl, rl, NULL, NULL);
101 *ratelimiterp = rl;
105 DESTROYLOCK(&rl->lock);
107 isc_mem_put(mctx, rl, sizeof(*rl));
112 isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) {
114 LOCK(&rl->lock);
115 rl->interval = *interval;
119 if (rl->state == isc_ratelimiter_ratelimited) {
120 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
121 &rl->interval, ISC_FALSE);
123 UNLOCK(&rl->lock);
128 isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, isc_uint32_t pertic) {
131 rl->pertic = pertic;
135 isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
146 LOCK(&rl->lock);
147 if (rl->state == isc_ratelimiter_ratelimited ||
148 rl->state == isc_ratelimiter_stalled) {
151 ISC_LIST_APPEND(rl->pending, ev, ev_link);
153 } else if (rl->state == isc_ratelimiter_idle) {
154 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
155 &rl->interval, ISC_FALSE);
158 rl->state = isc_ratelimiter_ratelimited;
161 INSIST(rl->state == isc_ratelimiter_shuttingdown);
164 UNLOCK(&rl->lock);
173 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
181 pertic = rl->pertic;
184 LOCK(&rl->lock);
185 p = ISC_LIST_HEAD(rl->pending);
190 ISC_LIST_UNLINK(rl->pending, p, ev_link);
196 result = isc_timer_reset(rl->timer,
200 rl->state = isc_ratelimiter_idle;
203 UNLOCK(&rl->lock);
213 isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) {
216 LOCK(&rl->lock);
217 rl->state = isc_ratelimiter_shuttingdown;
218 (void)isc_timer_reset(rl->timer, isc_timertype_inactive,
220 while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) {
221 ISC_LIST_UNLINK(rl->pending, ev, ev_link);
226 isc_timer_detach(&rl->timer);
231 ev = &rl->shutdownevent;
232 isc_task_send(rl->task, &ev);
234 UNLOCK(&rl->lock);
239 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
243 isc_ratelimiter_detach(&rl);
247 ratelimiter_free(isc_ratelimiter_t *rl) {
248 DESTROYLOCK(&rl->lock);
249 isc_mem_put(rl->mctx, rl, sizeof(*rl));
267 isc_ratelimiter_t *rl = *rlp;
270 LOCK(&rl->lock);
271 REQUIRE(rl->refs > 0);
272 rl->refs--;
273 if (rl->refs == 0)
275 UNLOCK(&rl->lock);
278 ratelimiter_free(rl);
284 isc_ratelimiter_stall(isc_ratelimiter_t *rl) {
287 LOCK(&rl->lock);
288 switch (rl->state) {
293 result = isc_timer_reset(rl->timer, isc_timertype_inactive,
298 rl->state = isc_ratelimiter_stalled;
301 UNLOCK(&rl->lock);
306 isc_ratelimiter_release(isc_ratelimiter_t *rl) {
309 LOCK(&rl->lock);
310 switch (rl->state) {
315 if (!ISC_LIST_EMPTY(rl->pending)) {
316 result = isc_timer_reset(rl->timer,
318 &rl->interval, ISC_FALSE);
320 rl->state = isc_ratelimiter_ratelimited;
322 rl->state = isc_ratelimiter_idle;
328 UNLOCK(&rl->lock);