Lines Matching refs:rl

62 	isc_ratelimiter_t *rl;
65 rl = isc_mem_get(mctx, sizeof(*rl));
66 *rl = (isc_ratelimiter_t){
73 isc_refcount_init(&rl->references, 1);
74 isc_interval_set(&rl->interval, 0, 0);
75 ISC_LIST_INIT(rl->pending);
77 isc_mutex_init(&rl->lock);
80 rl->task, ratelimiter_tick, rl, &rl->timer);
89 isc_refcount_increment(&rl->references);
91 ISC_EVENT_INIT(&rl->shutdownevent, sizeof(isc_event_t), 0, NULL,
93 ratelimiter_shutdowncomplete, rl, rl, NULL, NULL);
95 *ratelimiterp = rl;
99 isc_refcount_decrementz(&rl->references);
100 isc_refcount_destroy(&rl->references);
101 isc_mutex_destroy(&rl->lock);
102 isc_mem_put(mctx, rl, sizeof(*rl));
107 isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) {
110 REQUIRE(rl != NULL);
113 LOCK(&rl->lock);
114 rl->interval = *interval;
118 if (rl->state == isc_ratelimiter_ratelimited) {
119 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
120 &rl->interval, false);
122 UNLOCK(&rl->lock);
127 isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, uint32_t pertic) {
128 REQUIRE(rl != NULL);
133 rl->pertic = pertic;
137 isc_ratelimiter_setpushpop(isc_ratelimiter_t *rl, bool pushpop) {
138 REQUIRE(rl != NULL);
140 rl->pushpop = pushpop;
144 isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
149 REQUIRE(rl != NULL);
155 LOCK(&rl->lock);
156 if (rl->state == isc_ratelimiter_ratelimited ||
157 rl->state == isc_ratelimiter_stalled)
161 if (rl->pushpop) {
162 ISC_LIST_PREPEND(rl->pending, ev, ev_ratelink);
164 ISC_LIST_APPEND(rl->pending, ev, ev_ratelink);
166 } else if (rl->state == isc_ratelimiter_idle) {
167 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
168 &rl->interval, false);
171 rl->state = isc_ratelimiter_ratelimited;
174 INSIST(rl->state == isc_ratelimiter_shuttingdown);
177 UNLOCK(&rl->lock);
185 isc_ratelimiter_dequeue(isc_ratelimiter_t *rl, isc_event_t *event) {
188 REQUIRE(rl != NULL);
191 LOCK(&rl->lock);
193 ISC_LIST_UNLINK(rl->pending, event, ev_ratelink);
198 UNLOCK(&rl->lock);
204 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
212 pertic = rl->pertic;
215 LOCK(&rl->lock);
216 p = ISC_LIST_HEAD(rl->pending);
221 ISC_LIST_UNLINK(rl->pending, p, ev_ratelink);
228 rl->timer, isc_timertype_inactive, NULL, NULL,
231 rl->state = isc_ratelimiter_idle;
234 UNLOCK(&rl->lock);
244 isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) {
249 REQUIRE(rl != NULL);
251 LOCK(&rl->lock);
252 rl->state = isc_ratelimiter_shuttingdown;
253 (void)isc_timer_reset(rl->timer, isc_timertype_inactive, NULL, NULL,
255 while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) {
257 ISC_LIST_UNLINK(rl->pending, ev, ev_ratelink);
262 isc_task_attach(rl->task, &task);
264 result = isc_timer_reset(rl->timer, isc_timertype_inactive, NULL, NULL,
267 isc_timer_destroy(&rl->timer);
273 ev = &rl->shutdownevent;
274 isc_task_send(rl->task, &ev);
276 UNLOCK(&rl->lock);
281 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
285 isc_ratelimiter_detach(&rl);
290 ratelimiter_free(isc_ratelimiter_t *rl) {
291 isc_refcount_destroy(&rl->references);
292 isc_mutex_destroy(&rl->lock);
293 isc_mem_put(rl->mctx, rl, sizeof(*rl));
308 isc_ratelimiter_t *rl;
312 rl = *rlp;
315 if (isc_refcount_decrement(&rl->references) == 1) {
316 ratelimiter_free(rl);
321 isc_ratelimiter_stall(isc_ratelimiter_t *rl) {
324 REQUIRE(rl != NULL);
326 LOCK(&rl->lock);
327 switch (rl->state) {
332 result = isc_timer_reset(rl->timer, isc_timertype_inactive,
338 rl->state = isc_ratelimiter_stalled;
341 UNLOCK(&rl->lock);
346 isc_ratelimiter_release(isc_ratelimiter_t *rl) {
349 REQUIRE(rl != NULL);
351 LOCK(&rl->lock);
352 switch (rl->state) {
357 if (!ISC_LIST_EMPTY(rl->pending)) {
358 result = isc_timer_reset(rl->timer,
360 &rl->interval, false);
362 rl->state = isc_ratelimiter_ratelimited;
365 rl->state = isc_ratelimiter_idle;
372 UNLOCK(&rl->lock);