mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-08 11:53:00 -04:00
Use LIST rather than TAILQ for bufferevent_rate_limit_group members
Once again, there's no reason to keep these lists in the order we were keeping them in. Every time we needed to traverse them for any important purpose, we started at a random point anyway.
This commit is contained in:
parent
d313c29349
commit
974d004eea
@ -59,7 +59,7 @@ extern "C" {
|
||||
|
||||
struct bufferevent_rate_limit_group {
|
||||
/** List of all members in the group */
|
||||
TAILQ_HEAD(rlim_group_member_list, bufferevent_private) members;
|
||||
LIST_HEAD(rlim_group_member_list, bufferevent_private) members;
|
||||
/** Current limits for the group. */
|
||||
struct ev_token_bucket rate_limit;
|
||||
struct ev_token_bucket_cfg rate_limit_cfg;
|
||||
@ -108,7 +108,7 @@ struct bufferevent_rate_limit {
|
||||
*
|
||||
* Note that this field is supposed to be protected by the group
|
||||
* lock */
|
||||
TAILQ_ENTRY(bufferevent_private) next_in_group;
|
||||
LIST_ENTRY(bufferevent_private) next_in_group;
|
||||
/** The rate-limiting group for this bufferevent, or NULL if it is
|
||||
* only rate-limited on its own. */
|
||||
struct bufferevent_rate_limit_group *group;
|
||||
|
@ -339,7 +339,7 @@ _bev_group_suspend_reading(struct bufferevent_rate_limit_group *g)
|
||||
bufferevent, it will find out later when it looks at its limit
|
||||
and sees that its group is suspended.
|
||||
*/
|
||||
TAILQ_FOREACH(bev, &g->members, rate_limiting->next_in_group) {
|
||||
LIST_FOREACH(bev, &g->members, rate_limiting->next_in_group) {
|
||||
if (EVLOCK_TRY_LOCK(bev->lock)) {
|
||||
bufferevent_suspend_read(&bev->bev,
|
||||
BEV_SUSPEND_BW_GROUP);
|
||||
@ -357,7 +357,7 @@ _bev_group_suspend_writing(struct bufferevent_rate_limit_group *g)
|
||||
struct bufferevent_private *bev;
|
||||
g->write_suspended = 1;
|
||||
g->pending_unsuspend_write = 0;
|
||||
TAILQ_FOREACH(bev, &g->members, rate_limiting->next_in_group) {
|
||||
LIST_FOREACH(bev, &g->members, rate_limiting->next_in_group) {
|
||||
if (EVLOCK_TRY_LOCK(bev->lock)) {
|
||||
bufferevent_suspend_write(&bev->bev,
|
||||
BEV_SUSPEND_BW_GROUP);
|
||||
@ -429,13 +429,13 @@ _bev_group_random_element(struct bufferevent_rate_limit_group *group)
|
||||
if (!group->n_members)
|
||||
return NULL;
|
||||
|
||||
EVUTIL_ASSERT(! TAILQ_EMPTY(&group->members));
|
||||
EVUTIL_ASSERT(! LIST_EMPTY(&group->members));
|
||||
|
||||
which = _evutil_weakrand() % group->n_members;
|
||||
|
||||
bev = TAILQ_FIRST(&group->members);
|
||||
bev = LIST_FIRST(&group->members);
|
||||
while (which--)
|
||||
bev = TAILQ_NEXT(bev, rate_limiting->next_in_group);
|
||||
bev = LIST_NEXT(bev, rate_limiting->next_in_group);
|
||||
|
||||
return bev;
|
||||
}
|
||||
@ -450,12 +450,12 @@ _bev_group_random_element(struct bufferevent_rate_limit_group *group)
|
||||
#define FOREACH_RANDOM_ORDER(block) \
|
||||
do { \
|
||||
first = _bev_group_random_element(g); \
|
||||
for (bev = first; bev != TAILQ_END(&g->members); \
|
||||
bev = TAILQ_NEXT(bev, rate_limiting->next_in_group)) { \
|
||||
for (bev = first; bev != LIST_END(&g->members); \
|
||||
bev = LIST_NEXT(bev, rate_limiting->next_in_group)) { \
|
||||
block ; \
|
||||
} \
|
||||
for (bev = TAILQ_FIRST(&g->members); bev && bev != first; \
|
||||
bev = TAILQ_NEXT(bev, rate_limiting->next_in_group)) { \
|
||||
for (bev = LIST_FIRST(&g->members); bev && bev != first; \
|
||||
bev = LIST_NEXT(bev, rate_limiting->next_in_group)) { \
|
||||
block ; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -602,7 +602,7 @@ bufferevent_rate_limit_group_new(struct event_base *base,
|
||||
if (!g)
|
||||
return NULL;
|
||||
memcpy(&g->rate_limit_cfg, cfg, sizeof(g->rate_limit_cfg));
|
||||
TAILQ_INIT(&g->members);
|
||||
LIST_INIT(&g->members);
|
||||
|
||||
ev_token_bucket_init(&g->rate_limit, cfg, tick, 0);
|
||||
|
||||
@ -687,7 +687,7 @@ bufferevent_add_to_rate_limit_group(struct bufferevent *bev,
|
||||
LOCK_GROUP(g);
|
||||
bevp->rate_limiting->group = g;
|
||||
++g->n_members;
|
||||
TAILQ_INSERT_TAIL(&g->members, bevp, rate_limiting->next_in_group);
|
||||
LIST_INSERT_HEAD(&g->members, bevp, rate_limiting->next_in_group);
|
||||
|
||||
rsuspend = g->read_suspended;
|
||||
wsuspend = g->write_suspended;
|
||||
@ -715,7 +715,7 @@ bufferevent_remove_from_rate_limit_group(struct bufferevent *bev)
|
||||
LOCK_GROUP(g);
|
||||
bevp->rate_limiting->group = NULL;
|
||||
--g->n_members;
|
||||
TAILQ_REMOVE(&g->members, bevp, rate_limiting->next_in_group);
|
||||
LIST_REMOVE(bevp, rate_limiting->next_in_group);
|
||||
UNLOCK_GROUP(g);
|
||||
}
|
||||
bufferevent_unsuspend_read(bev, BEV_SUSPEND_BW_GROUP);
|
||||
|
Loading…
x
Reference in New Issue
Block a user