mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 04:50:37 -04:00
Remove previous_to_last from evbuffer
This commit is contained in:
parent
c8ac57f1f5
commit
6f47bd12ed
33
buffer.c
33
buffer.c
@ -219,7 +219,6 @@ evbuffer_chain_insert(struct evbuffer *buf, struct evbuffer_chain *chain)
|
|||||||
ASSERT_EVBUFFER_LOCKED(buf);
|
ASSERT_EVBUFFER_LOCKED(buf);
|
||||||
if (buf->first == NULL) {
|
if (buf->first == NULL) {
|
||||||
buf->first = buf->last = chain;
|
buf->first = buf->last = chain;
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
buf->last_with_data = chain;
|
buf->last_with_data = chain;
|
||||||
} else {
|
} else {
|
||||||
/* the last chain is empty so we can just drop it */
|
/* the last chain is empty so we can just drop it */
|
||||||
@ -227,10 +226,8 @@ evbuffer_chain_insert(struct evbuffer *buf, struct evbuffer_chain *chain)
|
|||||||
if (buf->last_with_data == buf->last)
|
if (buf->last_with_data == buf->last)
|
||||||
buf->last_with_data = chain;
|
buf->last_with_data = chain;
|
||||||
evbuffer_chain_free(buf->last);
|
evbuffer_chain_free(buf->last);
|
||||||
buf->previous_to_last->next = chain;
|
|
||||||
buf->last = chain;
|
buf->last = chain;
|
||||||
} else {
|
} else {
|
||||||
buf->previous_to_last = buf->last;
|
|
||||||
buf->last->next = chain;
|
buf->last->next = chain;
|
||||||
buf->last = chain;
|
buf->last = chain;
|
||||||
}
|
}
|
||||||
@ -625,7 +622,6 @@ done:
|
|||||||
ASSERT_EVBUFFER_LOCKED(dst); \
|
ASSERT_EVBUFFER_LOCKED(dst); \
|
||||||
(dst)->first = NULL; \
|
(dst)->first = NULL; \
|
||||||
(dst)->last = NULL; \
|
(dst)->last = NULL; \
|
||||||
(dst)->previous_to_last = NULL; \
|
|
||||||
(dst)->last_with_data = NULL; \
|
(dst)->last_with_data = NULL; \
|
||||||
(dst)->total_len = 0; \
|
(dst)->total_len = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -634,7 +630,6 @@ done:
|
|||||||
ASSERT_EVBUFFER_LOCKED(dst); \
|
ASSERT_EVBUFFER_LOCKED(dst); \
|
||||||
ASSERT_EVBUFFER_LOCKED(src); \
|
ASSERT_EVBUFFER_LOCKED(src); \
|
||||||
(dst)->first = (src)->first; \
|
(dst)->first = (src)->first; \
|
||||||
(dst)->previous_to_last = (src)->previous_to_last; \
|
|
||||||
(dst)->last_with_data = (src)->last_with_data; \
|
(dst)->last_with_data = (src)->last_with_data; \
|
||||||
(dst)->last = (src)->last; \
|
(dst)->last = (src)->last; \
|
||||||
(dst)->total_len = (src)->total_len; \
|
(dst)->total_len = (src)->total_len; \
|
||||||
@ -644,8 +639,6 @@ done:
|
|||||||
ASSERT_EVBUFFER_LOCKED(dst); \
|
ASSERT_EVBUFFER_LOCKED(dst); \
|
||||||
ASSERT_EVBUFFER_LOCKED(src); \
|
ASSERT_EVBUFFER_LOCKED(src); \
|
||||||
(dst)->last->next = (src)->first; \
|
(dst)->last->next = (src)->first; \
|
||||||
(dst)->previous_to_last = (src)->previous_to_last ? \
|
|
||||||
(src)->previous_to_last : (dst)->last; \
|
|
||||||
if ((src)->last_with_data) \
|
if ((src)->last_with_data) \
|
||||||
(dst)->last_with_data = (src)->last_with_data; \
|
(dst)->last_with_data = (src)->last_with_data; \
|
||||||
(dst)->last = (src)->last; \
|
(dst)->last = (src)->last; \
|
||||||
@ -658,8 +651,6 @@ done:
|
|||||||
(src)->last->next = (dst)->first; \
|
(src)->last->next = (dst)->first; \
|
||||||
(dst)->first = (src)->first; \
|
(dst)->first = (src)->first; \
|
||||||
(dst)->total_len += (src)->total_len; \
|
(dst)->total_len += (src)->total_len; \
|
||||||
if ((dst)->previous_to_last == NULL) \
|
|
||||||
(dst)->previous_to_last = (src)->last; \
|
|
||||||
if ((dst)->last_with_data == NULL) \
|
if ((dst)->last_with_data == NULL) \
|
||||||
(dst)->last_with_data = (src)->last_with_data; \
|
(dst)->last_with_data = (src)->last_with_data; \
|
||||||
} while (0)
|
} while (0)
|
||||||
@ -784,8 +775,6 @@ evbuffer_drain(struct evbuffer *buf, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf->first = chain;
|
buf->first = chain;
|
||||||
if (buf->first == buf->last)
|
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
chain->misalign += len;
|
chain->misalign += len;
|
||||||
chain->off -= len;
|
chain->off -= len;
|
||||||
}
|
}
|
||||||
@ -843,8 +832,6 @@ evbuffer_remove(struct evbuffer *buf, void *data_out, size_t datlen)
|
|||||||
buf->first = chain;
|
buf->first = chain;
|
||||||
if (chain == NULL)
|
if (chain == NULL)
|
||||||
buf->last = NULL;
|
buf->last = NULL;
|
||||||
if (buf->first == buf->last)
|
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
|
|
||||||
if (datlen) {
|
if (datlen) {
|
||||||
memcpy(data, chain->buffer + chain->misalign, datlen);
|
memcpy(data, chain->buffer + chain->misalign, datlen);
|
||||||
@ -873,7 +860,7 @@ evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst,
|
|||||||
/*XXX We should have an option to force this to be zero-copy.*/
|
/*XXX We should have an option to force this to be zero-copy.*/
|
||||||
|
|
||||||
/*XXX can fail badly on sendfile case. */
|
/*XXX can fail badly on sendfile case. */
|
||||||
struct evbuffer_chain *chain, *previous, *previous_to_previous = NULL;
|
struct evbuffer_chain *chain, *previous;
|
||||||
size_t nread = 0;
|
size_t nread = 0;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@ -907,7 +894,6 @@ evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst,
|
|||||||
EVUTIL_ASSERT(chain != src->last_with_data);
|
EVUTIL_ASSERT(chain != src->last_with_data);
|
||||||
nread += chain->off;
|
nread += chain->off;
|
||||||
datlen -= chain->off;
|
datlen -= chain->off;
|
||||||
previous_to_previous = previous;
|
|
||||||
previous = chain;
|
previous = chain;
|
||||||
chain = chain->next;
|
chain = chain->next;
|
||||||
}
|
}
|
||||||
@ -919,13 +905,10 @@ evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst,
|
|||||||
} else {
|
} else {
|
||||||
dst->last->next = src->first;
|
dst->last->next = src->first;
|
||||||
}
|
}
|
||||||
dst->previous_to_last = previous_to_previous;
|
|
||||||
dst->last = previous;
|
dst->last = previous;
|
||||||
dst->last_with_data = dst->last;
|
dst->last_with_data = dst->last;
|
||||||
previous->next = NULL;
|
previous->next = NULL;
|
||||||
src->first = chain;
|
src->first = chain;
|
||||||
if (src->first == src->last)
|
|
||||||
src->previous_to_last = NULL;
|
|
||||||
|
|
||||||
dst->total_len += nread;
|
dst->total_len += nread;
|
||||||
dst->n_add_for_cb += nread;
|
dst->n_add_for_cb += nread;
|
||||||
@ -1038,12 +1021,8 @@ evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size)
|
|||||||
memcpy(buffer, chain->buffer + chain->misalign, size);
|
memcpy(buffer, chain->buffer + chain->misalign, size);
|
||||||
chain->misalign += size;
|
chain->misalign += size;
|
||||||
chain->off -= size;
|
chain->off -= size;
|
||||||
if (chain == buf->last)
|
|
||||||
buf->previous_to_last = tmp;
|
|
||||||
} else {
|
} else {
|
||||||
buf->last = tmp;
|
buf->last = tmp;
|
||||||
/* the last is already the first, so we have no previous */
|
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp->next = chain;
|
tmp->next = chain;
|
||||||
@ -1441,8 +1420,6 @@ evbuffer_prepend(struct evbuffer *buf, const void *data, size_t datlen)
|
|||||||
if ((tmp = evbuffer_chain_new(datlen)) == NULL)
|
if ((tmp = evbuffer_chain_new(datlen)) == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
buf->first = tmp;
|
buf->first = tmp;
|
||||||
if (buf->previous_to_last == NULL)
|
|
||||||
buf->previous_to_last = tmp;
|
|
||||||
if (buf->last_with_data == NULL)
|
if (buf->last_with_data == NULL)
|
||||||
buf->last_with_data = tmp;
|
buf->last_with_data = tmp;
|
||||||
else if (chain && buf->last_with_data == chain && 0==chain->off)
|
else if (chain && buf->last_with_data == chain && 0==chain->off)
|
||||||
@ -1528,8 +1505,6 @@ evbuffer_expand(struct evbuffer *buf, size_t datlen)
|
|||||||
/* fix up the chain */
|
/* fix up the chain */
|
||||||
if (buf->first == chain)
|
if (buf->first == chain)
|
||||||
buf->first = tmp;
|
buf->first = tmp;
|
||||||
if (buf->previous_to_last)
|
|
||||||
buf->previous_to_last->next = tmp;
|
|
||||||
buf->last = tmp;
|
buf->last = tmp;
|
||||||
if (buf->last->off || buf->last_with_data == chain)
|
if (buf->last->off || buf->last_with_data == chain)
|
||||||
buf->last_with_data = tmp;
|
buf->last_with_data = tmp;
|
||||||
@ -1605,7 +1580,6 @@ _evbuffer_expand_fast(struct evbuffer *buf, size_t datlen, int n)
|
|||||||
if (tmp == NULL)
|
if (tmp == NULL)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
buf->previous_to_last = buf->last;
|
|
||||||
buf->last->next = tmp;
|
buf->last->next = tmp;
|
||||||
buf->last = tmp;
|
buf->last = tmp;
|
||||||
/* (we would only set last_with_data if we added the first
|
/* (we would only set last_with_data if we added the first
|
||||||
@ -1636,22 +1610,17 @@ _evbuffer_expand_fast(struct evbuffer *buf, size_t datlen, int n)
|
|||||||
if (rmv_all) {
|
if (rmv_all) {
|
||||||
ZERO_CHAIN(buf);
|
ZERO_CHAIN(buf);
|
||||||
} else {
|
} else {
|
||||||
/* XXX This error case should set
|
|
||||||
* previous_to_last to something better. */
|
|
||||||
buf->last = buf->last_with_data;
|
buf->last = buf->last_with_data;
|
||||||
buf->last_with_data->next = NULL;
|
buf->last_with_data->next = NULL;
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
}
|
}
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rmv_all) {
|
if (rmv_all) {
|
||||||
buf->first = buf->last = buf->last_with_data = tmp;
|
buf->first = buf->last = buf->last_with_data = tmp;
|
||||||
buf->previous_to_last = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
buf->last_with_data->next = tmp;
|
buf->last_with_data->next = tmp;
|
||||||
buf->last = tmp;
|
buf->last = tmp;
|
||||||
buf->previous_to_last = buf->last_with_data;
|
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
@ -73,19 +73,10 @@ struct evbuffer {
|
|||||||
struct evbuffer_chain *first;
|
struct evbuffer_chain *first;
|
||||||
/** The last chain in this buffer's linked list of chains. */
|
/** The last chain in this buffer's linked list of chains. */
|
||||||
struct evbuffer_chain *last;
|
struct evbuffer_chain *last;
|
||||||
/** The next-to-last chain in this buffer's linked list of chains.
|
|
||||||
* NULL if the buffer has 0 or 1 chains. Used in case there's an
|
|
||||||
* ongoing read that needs to be split across multiple chains: we want
|
|
||||||
* to add a new chain as a read target, but we don't want to lose our
|
|
||||||
* pointer to the next-to-last chain if the read turns out to be
|
|
||||||
* incomplete.
|
|
||||||
*/
|
|
||||||
/* FIXME: This should probably be called last_with_space and
|
|
||||||
* repurposed accordingly. */
|
|
||||||
struct evbuffer_chain *previous_to_last;
|
|
||||||
|
|
||||||
/** The last chain that has any data in it. If all chains in the
|
/** The last chain that has any data in it. If all chains in the
|
||||||
* buffer are empty, points to the first chain */
|
* buffer are empty, points to the first chain. If the buffer has no
|
||||||
|
* chains, this is NULL. */
|
||||||
struct evbuffer_chain *last_with_data;
|
struct evbuffer_chain *last_with_data;
|
||||||
|
|
||||||
/** Total amount of bytes stored in all chains.*/
|
/** Total amount of bytes stored in all chains.*/
|
||||||
|
@ -66,31 +66,24 @@
|
|||||||
static int
|
static int
|
||||||
_evbuffer_validate(struct evbuffer *buf)
|
_evbuffer_validate(struct evbuffer *buf)
|
||||||
{
|
{
|
||||||
struct evbuffer_chain *chain, *previous = NULL;
|
struct evbuffer_chain *chain;
|
||||||
size_t sum = 0;
|
size_t sum = 0;
|
||||||
int found_last_with_data = 0;
|
int found_last_with_data = 0;
|
||||||
|
|
||||||
if (buf->first == NULL) {
|
if (buf->first == NULL) {
|
||||||
tt_assert(buf->last == NULL);
|
tt_assert(buf->last == NULL);
|
||||||
tt_assert(buf->previous_to_last == NULL);
|
|
||||||
tt_assert(buf->total_len == 0);
|
tt_assert(buf->total_len == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf->previous_to_last == NULL) {
|
|
||||||
tt_assert(buf->first == buf->last);
|
|
||||||
}
|
|
||||||
|
|
||||||
chain = buf->first;
|
chain = buf->first;
|
||||||
while (chain != NULL) {
|
while (chain != NULL) {
|
||||||
if (chain == buf->last_with_data)
|
if (chain == buf->last_with_data)
|
||||||
found_last_with_data = 1;
|
found_last_with_data = 1;
|
||||||
sum += chain->off;
|
sum += chain->off;
|
||||||
if (chain->next == NULL) {
|
if (chain->next == NULL) {
|
||||||
tt_assert(buf->previous_to_last == previous);
|
|
||||||
tt_assert(buf->last == chain);
|
tt_assert(buf->last == chain);
|
||||||
}
|
}
|
||||||
tt_assert(chain->buffer_len >= chain->misalign + chain->off);
|
tt_assert(chain->buffer_len >= chain->misalign + chain->off);
|
||||||
previous = chain;
|
|
||||||
chain = chain->next;
|
chain = chain->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user