Lines Matching defs:rl

54 	isc_ratelimiter_t *rl;
57 rl = isc_mem_get(mctx, sizeof(*rl));
58 if (rl == NULL)
60 rl->mctx = mctx;
61 rl->refs = 1;
62 rl->task = task;
63 isc_interval_set(&rl->interval, 0, 0);
64 rl->timer = NULL;
65 rl->pertic = 1;
66 rl->pushpop = ISC_FALSE;
67 rl->state = isc_ratelimiter_idle;
68 ISC_LIST_INIT(rl->pending);
70 result = isc_mutex_init(&rl->lock);
75 NULL, NULL, rl->task, ratelimiter_tick,
76 rl, &rl->timer);
84 rl->refs++;
86 ISC_EVENT_INIT(&rl->shutdownevent,
89 ratelimiter_shutdowncomplete, rl, rl, NULL, NULL);
91 *ratelimiterp = rl;
95 DESTROYLOCK(&rl->lock);
97 isc_mem_put(mctx, rl, sizeof(*rl));
102 isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) {
105 REQUIRE(rl != NULL);
108 LOCK(&rl->lock);
109 rl->interval = *interval;
113 if (rl->state == isc_ratelimiter_ratelimited) {
114 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
115 &rl->interval, ISC_FALSE);
117 UNLOCK(&rl->lock);
122 isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, isc_uint32_t pertic) {
124 REQUIRE(rl != NULL);
128 rl->pertic = pertic;
132 isc_ratelimiter_setpushpop(isc_ratelimiter_t *rl, isc_boolean_t pushpop) {
134 REQUIRE(rl != NULL);
136 rl->pushpop = pushpop;
140 isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
146 REQUIRE(rl != NULL);
152 LOCK(&rl->lock);
153 if (rl->state == isc_ratelimiter_ratelimited ||
154 rl->state == isc_ratelimiter_stalled) {
157 if (rl->pushpop)
158 ISC_LIST_PREPEND(rl->pending, ev, ev_ratelink);
160 ISC_LIST_APPEND(rl->pending, ev, ev_ratelink);
161 } else if (rl->state == isc_ratelimiter_idle) {
162 result = isc_timer_reset(rl->timer, isc_timertype_ticker, NULL,
163 &rl->interval, ISC_FALSE);
166 rl->state = isc_ratelimiter_ratelimited;
169 INSIST(rl->state == isc_ratelimiter_shuttingdown);
172 UNLOCK(&rl->lock);
179 isc_ratelimiter_dequeue(isc_ratelimiter_t *rl, isc_event_t *event) {
182 REQUIRE(rl != NULL);
185 LOCK(&rl->lock);
187 ISC_LIST_UNLINK(rl->pending, event, ev_ratelink);
191 UNLOCK(&rl->lock);
198 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
206 pertic = rl->pertic;
209 LOCK(&rl->lock);
210 p = ISC_LIST_HEAD(rl->pending);
215 ISC_LIST_UNLINK(rl->pending, p, ev_ratelink);
221 result = isc_timer_reset(rl->timer,
225 rl->state = isc_ratelimiter_idle;
228 UNLOCK(&rl->lock);
238 isc_ratelimiter_shutdown(isc_ratelimiter_t *rl) {
242 REQUIRE(rl != NULL);
244 LOCK(&rl->lock);
245 rl->state = isc_ratelimiter_shuttingdown;
246 (void)isc_timer_reset(rl->timer, isc_timertype_inactive,
248 while ((ev = ISC_LIST_HEAD(rl->pending)) != NULL) {
249 ISC_LIST_UNLINK(rl->pending, ev, ev_ratelink);
254 isc_timer_detach(&rl->timer);
260 ev = &rl->shutdownevent;
261 isc_task_send(rl->task, &ev);
263 UNLOCK(&rl->lock);
268 isc_ratelimiter_t *rl = (isc_ratelimiter_t *)event->ev_arg;
272 isc_ratelimiter_detach(&rl);
276 ratelimiter_free(isc_ratelimiter_t *rl) {
277 DESTROYLOCK(&rl->lock);
278 isc_mem_put(rl->mctx, rl, sizeof(*rl));
297 isc_ratelimiter_t *rl;
302 rl = *rlp;
304 LOCK(&rl->lock);
305 REQUIRE(rl->refs > 0);
306 rl->refs--;
307 if (rl->refs == 0)
309 UNLOCK(&rl->lock);
312 ratelimiter_free(rl);
318 isc_ratelimiter_stall(isc_ratelimiter_t *rl) {
321 REQUIRE(rl != NULL);
323 LOCK(&rl->lock);
324 switch (rl->state) {
329 result = isc_timer_reset(rl->timer, isc_timertype_inactive,
335 rl->state = isc_ratelimiter_stalled;
338 UNLOCK(&rl->lock);
343 isc_ratelimiter_release(isc_ratelimiter_t *rl) {
346 REQUIRE(rl != NULL);
348 LOCK(&rl->lock);
349 switch (rl->state) {
354 if (!ISC_LIST_EMPTY(rl->pending)) {
355 result = isc_timer_reset(rl->timer,
357 &rl->interval, ISC_FALSE);
359 rl->state = isc_ratelimiter_ratelimited;
361 rl->state = isc_ratelimiter_idle;
367 UNLOCK(&rl->lock);