mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 13:04:23 -04:00
Use LIST rather than TAILQ for evbuffer callbacks
There's no reason to traverse these out-of-order, and we never defined the order that you'd get your callbacks on an evbuffer if you happened to add more than one.
This commit is contained in:
parent
6494772e32
commit
d313c29349
24
buffer.c
24
buffer.c
@ -302,7 +302,7 @@ evbuffer_new(void)
|
|||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
TAILQ_INIT(&buffer->callbacks);
|
LIST_INIT(&buffer->callbacks);
|
||||||
buffer->refcnt = 1;
|
buffer->refcnt = 1;
|
||||||
buffer->last_with_datap = &buffer->first;
|
buffer->last_with_datap = &buffer->first;
|
||||||
|
|
||||||
@ -393,7 +393,7 @@ evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred)
|
|||||||
|
|
||||||
ASSERT_EVBUFFER_LOCKED(buffer);
|
ASSERT_EVBUFFER_LOCKED(buffer);
|
||||||
|
|
||||||
if (TAILQ_EMPTY(&buffer->callbacks)) {
|
if (LIST_EMPTY(&buffer->callbacks)) {
|
||||||
buffer->n_add_for_cb = buffer->n_del_for_cb = 0;
|
buffer->n_add_for_cb = buffer->n_del_for_cb = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -408,12 +408,12 @@ evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred)
|
|||||||
buffer->n_add_for_cb = 0;
|
buffer->n_add_for_cb = 0;
|
||||||
buffer->n_del_for_cb = 0;
|
buffer->n_del_for_cb = 0;
|
||||||
}
|
}
|
||||||
for (cbent = TAILQ_FIRST(&buffer->callbacks);
|
for (cbent = LIST_FIRST(&buffer->callbacks);
|
||||||
cbent != TAILQ_END(&buffer->callbacks);
|
cbent != LIST_END(&buffer->callbacks);
|
||||||
cbent = next) {
|
cbent = next) {
|
||||||
/* Get the 'next' pointer now in case this callback decides
|
/* Get the 'next' pointer now in case this callback decides
|
||||||
* to remove itself or something. */
|
* to remove itself or something. */
|
||||||
next = TAILQ_NEXT(cbent, next);
|
next = LIST_NEXT(cbent, next);
|
||||||
|
|
||||||
if ((cbent->flags & mask) != masked_val)
|
if ((cbent->flags & mask) != masked_val)
|
||||||
continue;
|
continue;
|
||||||
@ -463,9 +463,9 @@ evbuffer_remove_all_callbacks(struct evbuffer *buffer)
|
|||||||
{
|
{
|
||||||
struct evbuffer_cb_entry *cbent;
|
struct evbuffer_cb_entry *cbent;
|
||||||
|
|
||||||
while ((cbent = TAILQ_FIRST(&buffer->callbacks))) {
|
while ((cbent = LIST_FIRST(&buffer->callbacks))) {
|
||||||
TAILQ_REMOVE(&buffer->callbacks, cbent, next);
|
LIST_REMOVE(cbent, next);
|
||||||
mm_free(cbent);
|
mm_free(cbent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2631,7 +2631,7 @@ evbuffer_setcb(struct evbuffer *buffer, evbuffer_cb cb, void *cbarg)
|
|||||||
{
|
{
|
||||||
EVBUFFER_LOCK(buffer);
|
EVBUFFER_LOCK(buffer);
|
||||||
|
|
||||||
if (!TAILQ_EMPTY(&buffer->callbacks))
|
if (!LIST_EMPTY(&buffer->callbacks))
|
||||||
evbuffer_remove_all_callbacks(buffer);
|
evbuffer_remove_all_callbacks(buffer);
|
||||||
|
|
||||||
if (cb) {
|
if (cb) {
|
||||||
@ -2653,7 +2653,7 @@ evbuffer_add_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg)
|
|||||||
e->cb.cb_func = cb;
|
e->cb.cb_func = cb;
|
||||||
e->cbarg = cbarg;
|
e->cbarg = cbarg;
|
||||||
e->flags = EVBUFFER_CB_ENABLED;
|
e->flags = EVBUFFER_CB_ENABLED;
|
||||||
TAILQ_INSERT_HEAD(&buffer->callbacks, e, next);
|
LIST_INSERT_HEAD(&buffer->callbacks, e, next);
|
||||||
EVBUFFER_UNLOCK(buffer);
|
EVBUFFER_UNLOCK(buffer);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@ -2663,7 +2663,7 @@ evbuffer_remove_cb_entry(struct evbuffer *buffer,
|
|||||||
struct evbuffer_cb_entry *ent)
|
struct evbuffer_cb_entry *ent)
|
||||||
{
|
{
|
||||||
EVBUFFER_LOCK(buffer);
|
EVBUFFER_LOCK(buffer);
|
||||||
TAILQ_REMOVE(&buffer->callbacks, ent, next);
|
LIST_REMOVE(ent, next);
|
||||||
EVBUFFER_UNLOCK(buffer);
|
EVBUFFER_UNLOCK(buffer);
|
||||||
mm_free(ent);
|
mm_free(ent);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2675,7 +2675,7 @@ evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg)
|
|||||||
struct evbuffer_cb_entry *cbent;
|
struct evbuffer_cb_entry *cbent;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
EVBUFFER_LOCK(buffer);
|
EVBUFFER_LOCK(buffer);
|
||||||
TAILQ_FOREACH(cbent, &buffer->callbacks, next) {
|
LIST_FOREACH(cbent, &buffer->callbacks, next) {
|
||||||
if (cb == cbent->cb.cb_func && cbarg == cbent->cbarg) {
|
if (cb == cbent->cb.cb_func && cbarg == cbent->cbarg) {
|
||||||
result = evbuffer_remove_cb_entry(buffer, cbent);
|
result = evbuffer_remove_cb_entry(buffer, cbent);
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -146,7 +146,7 @@ evbuffer_overlapped_new(evutil_socket_t fd)
|
|||||||
|
|
||||||
evo = mm_calloc(1, sizeof(struct evbuffer_overlapped));
|
evo = mm_calloc(1, sizeof(struct evbuffer_overlapped));
|
||||||
|
|
||||||
TAILQ_INIT(&evo->buffer.callbacks);
|
LIST_INIT(&evo->buffer.callbacks);
|
||||||
evo->buffer.refcnt = 1;
|
evo->buffer.refcnt = 1;
|
||||||
|
|
||||||
evo->buffer.is_overlapped = 1;
|
evo->buffer.is_overlapped = 1;
|
||||||
|
@ -59,7 +59,7 @@ extern "C" {
|
|||||||
* when bytes are added to or removed from the evbuffer. */
|
* when bytes are added to or removed from the evbuffer. */
|
||||||
struct evbuffer_cb_entry {
|
struct evbuffer_cb_entry {
|
||||||
/** Structures to implement a doubly-linked queue of callbacks */
|
/** Structures to implement a doubly-linked queue of callbacks */
|
||||||
TAILQ_ENTRY(evbuffer_cb_entry) next;
|
LIST_ENTRY(evbuffer_cb_entry) next;
|
||||||
/** The callback function to invoke when this callback is called.
|
/** The callback function to invoke when this callback is called.
|
||||||
If EVBUFFER_CB_OBSOLETE is set in flags, the cb_obsolete field is
|
If EVBUFFER_CB_OBSOLETE is set in flags, the cb_obsolete field is
|
||||||
valid; otherwise, cb_func is valid. */
|
valid; otherwise, cb_func is valid. */
|
||||||
@ -144,7 +144,7 @@ struct evbuffer {
|
|||||||
struct deferred_cb deferred;
|
struct deferred_cb deferred;
|
||||||
|
|
||||||
/** A doubly-linked-list of callback functions */
|
/** A doubly-linked-list of callback functions */
|
||||||
TAILQ_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
|
LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
|
||||||
|
|
||||||
/** The parent bufferevent object this evbuffer belongs to.
|
/** The parent bufferevent object this evbuffer belongs to.
|
||||||
* NULL if the evbuffer stands alone. */
|
* NULL if the evbuffer stands alone. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user