Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
BIND
Commits
c052487c
Commit
c052487c
authored
May 11, 2000
by
Mark Andrews
Browse files
169. [func] ratelimiter can now process N events per interval.
parent
2fc337ec
Changes
3
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
c052487c
169. [func] ratelimiter can now process N events per interval.
168. [bug] include statements in named.conf caused syntax errors
due to not consuming the semicolon ending the include
statement before switching input streams.
...
...
lib/isc/include/isc/ratelimiter.h
View file @
c052487c
...
...
@@ -59,6 +59,13 @@ isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval);
* '*interval' is a nonzero interval.
*/
void
isc_ratelimiter_setpertic
(
isc_ratelimiter_t
*
rl
,
isc_uint32_t
perint
);
/*
* Set the number of events procesed per interval timer tic.
* If 'perint' is zero it is trated as 1.
*/
isc_result_t
isc_ratelimiter_enqueue
(
isc_ratelimiter_t
*
rl
,
isc_event_t
**
eventp
);
/*
...
...
lib/isc/ratelimiter.c
View file @
c052487c
...
...
@@ -36,6 +36,7 @@ struct isc_ratelimiter {
isc_task_t
*
task
;
isc_timer_t
*
timer
;
isc_interval_t
interval
;
isc_uint32_t
pertic
;
isc_ratelimiter_state_t
state
;
isc_event_t
shutdownevent
;
ISC_LIST
(
isc_event_t
)
pending
;
...
...
@@ -69,6 +70,7 @@ isc_ratelimiter_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
rl
->
task
=
task
;
isc_interval_set
(
&
rl
->
interval
,
0
,
0
);
rl
->
timer
=
NULL
;
rl
->
pertic
=
1
;
rl
->
state
=
isc_ratelimiter_worklimited
;
ISC_LIST_INIT
(
rl
->
pending
);
...
...
@@ -111,6 +113,13 @@ isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval) {
UNLOCK
(
&
rl
->
lock
);
return
(
result
);
}
void
isc_ratelimiter_setpertic
(
isc_ratelimiter_t
*
rl
,
isc_uint32_t
pertic
)
{
if
(
pertic
==
0
)
pertic
=
1
;
rl
->
pertic
=
pertic
;
}
isc_result_t
isc_ratelimiter_enqueue
(
isc_ratelimiter_t
*
rl
,
isc_event_t
**
eventp
)
{
...
...
@@ -142,34 +151,38 @@ ratelimiter_tick(isc_task_t *task, isc_event_t *event) {
isc_result_t
result
=
ISC_R_SUCCESS
;
isc_ratelimiter_t
*
rl
=
(
isc_ratelimiter_t
*
)
event
->
ev_arg
;
isc_event_t
*
p
;
isc_uint32_t
pertic
;
UNUSED
(
task
);
LOCK
(
&
rl
->
lock
);
p
=
ISC_LIST_HEAD
(
rl
->
pending
);
if
(
p
!=
NULL
)
{
/*
* There is work to do. Let's do it after unlocking.
*/
ISC_LIST_UNLINK
(
rl
->
pending
,
p
,
ev_link
);
}
else
{
/*
* No work left to do. Stop the timer so that we don't
* waste resources by having it fire periodically.
*/
result
=
isc_timer_reset
(
rl
->
timer
,
isc_timertype_inactive
,
NULL
,
NULL
,
ISC_FALSE
);
RUNTIME_CHECK
(
result
==
ISC_R_SUCCESS
);
rl
->
state
=
isc_ratelimiter_worklimited
;
}
UNLOCK
(
&
rl
->
lock
);
isc_event_free
(
&
event
);
/*
* If we have an event, dispatch it.
* There is potential for optimization here since
* we are already executing in the context of "task".
*/
if
(
p
!=
NULL
)
isc_task_send
(
rl
->
task
,
&
p
);
INSIST
(
p
==
NULL
);
pertic
=
rl
->
pertic
;
while
(
pertic
!=
0
)
{
pertic
--
;
LOCK
(
&
rl
->
lock
);
p
=
ISC_LIST_HEAD
(
rl
->
pending
);
if
(
p
!=
NULL
)
{
/*
* There is work to do. Let's do it after unlocking.
*/
ISC_LIST_UNLINK
(
rl
->
pending
,
p
,
ev_link
);
}
else
{
/*
* No work left to do. Stop the timer so that we don't
* waste resources by having it fire periodically.
*/
result
=
isc_timer_reset
(
rl
->
timer
,
isc_timertype_inactive
,
NULL
,
NULL
,
ISC_FALSE
);
RUNTIME_CHECK
(
result
==
ISC_R_SUCCESS
);
rl
->
state
=
isc_ratelimiter_worklimited
;
pertic
=
0
;
/* Force the loop to exit. */
}
UNLOCK
(
&
rl
->
lock
);
if
(
p
!=
NULL
)
isc_task_send
(
rl
->
task
,
&
p
);
INSIST
(
p
==
NULL
);
}
}
void
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment