Remove previous_to_last from evbuffer

This commit is contained in:
Nick Mathewson 2010-03-10 23:28:51 -05:00
parent c8ac57f1f5
commit 6f47bd12ed
3 changed files with 4 additions and 51 deletions

View File

@ -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);
} }

View File

@ -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.*/

View File

@ -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;
} }