Lines Matching refs:rl

64 	isc_ratelimiter_t *rl;  in isc_ratelimiter_create()  local
67 rl = isc_mem_get(mctx, sizeof(*rl)); in isc_ratelimiter_create()
68 if (rl == NULL) in isc_ratelimiter_create()
70 rl->mctx = mctx; in isc_ratelimiter_create()
71 rl->refs = 1; in isc_ratelimiter_create()
72 rl->task = task; in isc_ratelimiter_create()
73 isc_interval_set(&rl->interval, 0, 0); in isc_ratelimiter_create()
74 rl->timer = NULL; in isc_ratelimiter_create()
75 rl->pertic = 1; in isc_ratelimiter_create()
76 rl->state = isc_ratelimiter_idle; in isc_ratelimiter_create()
77 ISC_LIST_INIT(rl->pending); in isc_ratelimiter_create()
79 result = isc_mutex_init(&rl->lock); in isc_ratelimiter_create()
83 NULL, NULL, rl->task, ratelimiter_tick, in isc_ratelimiter_create()
84 rl, &rl->timer); in isc_ratelimiter_create()
92 rl->refs++; in isc_ratelimiter_create()
94 ISC_EVENT_INIT(&rl->shutdownevent, in isc_ratelimiter_create()
97 ratelimiter_shutdowncomplete, rl, rl, NULL, NULL); in isc_ratelimiter_create()
99 *ratelimiterp = rl; in isc_ratelimiter_create()
103 DESTROYLOCK(&rl->lock); in isc_ratelimiter_create()
105 isc_mem_put(mctx, rl, sizeof(*rl)); in isc_ratelimiter_create()
110 isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) { in isc_ratelimiter_setinterval() argument
112 LOCK(&rl->lock); in isc_ratelimiter_setinterval()
113 rl->interval = *interval; in isc_ratelimiter_setinterval()
117 if (rl->state == isc_ratelimiter_ratelimited) { in isc_ratelimiter_setinterval()
118 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL, in isc_ratelimiter_setinterval()
119 &rl->interval, ISC_FALSE); in isc_ratelimiter_setinterval()
121 UNLOCK(&rl->lock); in isc_ratelimiter_setinterval()
126 isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, isc_uint32_t pertic) { in isc_ratelimiter_setpertic() argument
129 rl->pertic = pertic; in isc_ratelimiter_setpertic()
133 isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task, in isc_ratelimiter_enqueue() argument
144 LOCK(&rl->lock); in isc_ratelimiter_enqueue()
145 if (rl->state == isc_ratelimiter_ratelimited || in isc_ratelimiter_enqueue()
146 rl->state == isc_ratelimiter_stalled) { in isc_ratelimiter_enqueue()
149 ISC_LIST_APPEND(rl->pending, ev, ev_link); in isc_ratelimiter_enqueue()
151 } else if (rl->state == isc_ratelimiter_idle) { in isc_ratelimiter_enqueue()
152 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL, in isc_ratelimiter_enqueue()
153 &rl->interval, ISC_FALSE); in isc_ratelimiter_enqueue()
156 rl->state = isc_ratelimiter_ratelimited; in isc_ratelimiter_enqueue()
159 INSIST(rl->state == isc_ratelimiter_shuttingdown); in isc_ratelimiter_enqueue()
162 UNLOCK(&rl->lock); in isc_ratelimiter_enqueue()
171 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg; in ratelimiter_tick() local
179 pertic = rl->pertic; in ratelimiter_tick()
182 LOCK(&rl->lock); in ratelimiter_tick()
183 p = ISC_LIST_HEAD(rl->pending); in ratelimiter_tick()
188 ISC_LIST_UNLINK(rl->pending, p, ev_link); in ratelimiter_tick()
194 result = isc_timer_reset(rl->timer, in ratelimiter_tick()
198 rl->state = isc_ratelimiter_idle; in ratelimiter_tick()
201 UNLOCK(&rl->lock); in ratelimiter_tick()
211 isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) { in isc_ratelimiter_shutdown() argument
214 LOCK(&rl->lock); in isc_ratelimiter_shutdown()
215 rl->state = isc_ratelimiter_shuttingdown; in isc_ratelimiter_shutdown()
216 (void)isc_timer_reset(rl->timer, isc_timertype_inactive, in isc_ratelimiter_shutdown()
218 while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) { in isc_ratelimiter_shutdown()
219 ISC_LIST_UNLINK(rl->pending, ev, ev_link); in isc_ratelimiter_shutdown()
224 isc_timer_detach(&rl->timer); in isc_ratelimiter_shutdown()
229 ev = &rl->shutdownevent; in isc_ratelimiter_shutdown()
230 isc_task_send(rl->task, &ev); in isc_ratelimiter_shutdown()
232 UNLOCK(&rl->lock); in isc_ratelimiter_shutdown()
237 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg; in ratelimiter_shutdowncomplete() local
241 isc_ratelimiter_detach(&rl); in ratelimiter_shutdowncomplete()
245 ratelimiter_free(isc_ratelimiter_t *rl) { in ratelimiter_free() argument
246 DESTROYLOCK(&rl->lock); in ratelimiter_free()
247 isc_mem_put(rl->mctx, rl, sizeof(*rl)); in ratelimiter_free()
265 isc_ratelimiter_t *rl = *rlp; in isc_ratelimiter_detach() local
268 LOCK(&rl->lock); in isc_ratelimiter_detach()
269 REQUIRE(rl->refs > 0); in isc_ratelimiter_detach()
270 rl->refs--; in isc_ratelimiter_detach()
271 if (rl->refs == 0) in isc_ratelimiter_detach()
273 UNLOCK(&rl->lock); in isc_ratelimiter_detach()
276 ratelimiter_free(rl); in isc_ratelimiter_detach()
282 isc_ratelimiter_stall(isc_ratelimiter_t *rl) { in isc_ratelimiter_stall() argument
285 LOCK(&rl->lock); in isc_ratelimiter_stall()
286 switch (rl->state) { in isc_ratelimiter_stall()
291 result = isc_timer_reset(rl->timer, isc_timertype_inactive, in isc_ratelimiter_stall()
296 rl->state = isc_ratelimiter_stalled; in isc_ratelimiter_stall()
299 UNLOCK(&rl->lock); in isc_ratelimiter_stall()
304 isc_ratelimiter_release(isc_ratelimiter_t *rl) { in isc_ratelimiter_release() argument
307 LOCK(&rl->lock); in isc_ratelimiter_release()
308 switch (rl->state) { in isc_ratelimiter_release()
313 if (!ISC_LIST_EMPTY(rl->pending)) { in isc_ratelimiter_release()
314 result = isc_timer_reset(rl->timer, in isc_ratelimiter_release()
316 &rl->interval, ISC_FALSE); in isc_ratelimiter_release()
318 rl->state = isc_ratelimiter_ratelimited; in isc_ratelimiter_release()
320 rl->state = isc_ratelimiter_idle; in isc_ratelimiter_release()
326 UNLOCK(&rl->lock); in isc_ratelimiter_release()