From 6f47bd12ed27085f68573a02dfa2e2761eb1e6b0 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 10 Mar 2010 23:28:51 -0500 Subject: [PATCH] Remove previous_to_last from evbuffer --- buffer.c | 33 +-------------------------------- evbuffer-internal.h | 13 ++----------- test/regress_buffer.c | 9 +-------- 3 files changed, 4 insertions(+), 51 deletions(-) diff --git a/buffer.c b/buffer.c index b58d2253..700a1945 100644 --- a/buffer.c +++ b/buffer.c @@ -219,7 +219,6 @@ evbuffer_chain_insert(struct evbuffer *buf, struct evbuffer_chain *chain) ASSERT_EVBUFFER_LOCKED(buf); if (buf->first == NULL) { buf->first = buf->last = chain; - buf->previous_to_last = NULL; buf->last_with_data = chain; } else { /* 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) buf->last_with_data = chain; evbuffer_chain_free(buf->last); - buf->previous_to_last->next = chain; buf->last = chain; } else { - buf->previous_to_last = buf->last; buf->last->next = chain; buf->last = chain; } @@ -625,7 +622,6 @@ done: ASSERT_EVBUFFER_LOCKED(dst); \ (dst)->first = NULL; \ (dst)->last = NULL; \ - (dst)->previous_to_last = NULL; \ (dst)->last_with_data = NULL; \ (dst)->total_len = 0; \ } while (0) @@ -634,7 +630,6 @@ done: ASSERT_EVBUFFER_LOCKED(dst); \ ASSERT_EVBUFFER_LOCKED(src); \ (dst)->first = (src)->first; \ - (dst)->previous_to_last = (src)->previous_to_last; \ (dst)->last_with_data = (src)->last_with_data; \ (dst)->last = (src)->last; \ (dst)->total_len = (src)->total_len; \ @@ -644,8 +639,6 @@ done: ASSERT_EVBUFFER_LOCKED(dst); \ ASSERT_EVBUFFER_LOCKED(src); \ (dst)->last->next = (src)->first; \ - (dst)->previous_to_last = (src)->previous_to_last ? \ - (src)->previous_to_last : (dst)->last; \ if ((src)->last_with_data) \ (dst)->last_with_data = (src)->last_with_data; \ (dst)->last = (src)->last; \ @@ -658,8 +651,6 @@ done: (src)->last->next = (dst)->first; \ (dst)->first = (src)->first; \ (dst)->total_len += (src)->total_len; \ - if ((dst)->previous_to_last == NULL) \ - (dst)->previous_to_last = (src)->last; \ if ((dst)->last_with_data == NULL) \ (dst)->last_with_data = (src)->last_with_data; \ } while (0) @@ -784,8 +775,6 @@ evbuffer_drain(struct evbuffer *buf, size_t len) } buf->first = chain; - if (buf->first == buf->last) - buf->previous_to_last = NULL; chain->misalign += len; chain->off -= len; } @@ -843,8 +832,6 @@ evbuffer_remove(struct evbuffer *buf, void *data_out, size_t datlen) buf->first = chain; if (chain == NULL) buf->last = NULL; - if (buf->first == buf->last) - buf->previous_to_last = NULL; if (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 can fail badly on sendfile case. */ - struct evbuffer_chain *chain, *previous, *previous_to_previous = NULL; + struct evbuffer_chain *chain, *previous; size_t nread = 0; int result; @@ -907,7 +894,6 @@ evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst, EVUTIL_ASSERT(chain != src->last_with_data); nread += chain->off; datlen -= chain->off; - previous_to_previous = previous; previous = chain; chain = chain->next; } @@ -919,13 +905,10 @@ evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst, } else { dst->last->next = src->first; } - dst->previous_to_last = previous_to_previous; dst->last = previous; dst->last_with_data = dst->last; previous->next = NULL; src->first = chain; - if (src->first == src->last) - src->previous_to_last = NULL; dst->total_len += 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); chain->misalign += size; chain->off -= size; - if (chain == buf->last) - buf->previous_to_last = tmp; } else { buf->last = tmp; - /* the last is already the first, so we have no previous */ - buf->previous_to_last = NULL; } 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) goto done; buf->first = tmp; - if (buf->previous_to_last == NULL) - buf->previous_to_last = tmp; if (buf->last_with_data == NULL) buf->last_with_data = tmp; 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 */ if (buf->first == chain) buf->first = tmp; - if (buf->previous_to_last) - buf->previous_to_last->next = tmp; buf->last = tmp; if (buf->last->off || buf->last_with_data == chain) buf->last_with_data = tmp; @@ -1605,7 +1580,6 @@ _evbuffer_expand_fast(struct evbuffer *buf, size_t datlen, int n) if (tmp == NULL) return (-1); - buf->previous_to_last = buf->last; buf->last->next = tmp; buf->last = tmp; /* (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) { ZERO_CHAIN(buf); } else { - /* XXX This error case should set - * previous_to_last to something better. */ buf->last = buf->last_with_data; buf->last_with_data->next = NULL; - buf->previous_to_last = NULL; } return (-1); } if (rmv_all) { buf->first = buf->last = buf->last_with_data = tmp; - buf->previous_to_last = NULL; } else { buf->last_with_data->next = tmp; buf->last = tmp; - buf->previous_to_last = buf->last_with_data; } return (0); } diff --git a/evbuffer-internal.h b/evbuffer-internal.h index d59b6a36..e8555dbd 100644 --- a/evbuffer-internal.h +++ b/evbuffer-internal.h @@ -73,19 +73,10 @@ struct evbuffer { struct evbuffer_chain *first; /** The last chain in this buffer's linked list of chains. */ 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 - * 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; /** Total amount of bytes stored in all chains.*/ diff --git a/test/regress_buffer.c b/test/regress_buffer.c index d5e25c92..55f02f7e 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -66,31 +66,24 @@ static int _evbuffer_validate(struct evbuffer *buf) { - struct evbuffer_chain *chain, *previous = NULL; + struct evbuffer_chain *chain; size_t sum = 0; int found_last_with_data = 0; if (buf->first == NULL) { tt_assert(buf->last == NULL); - tt_assert(buf->previous_to_last == NULL); tt_assert(buf->total_len == 0); } - if (buf->previous_to_last == NULL) { - tt_assert(buf->first == buf->last); - } - chain = buf->first; while (chain != NULL) { if (chain == buf->last_with_data) found_last_with_data = 1; sum += chain->off; if (chain->next == NULL) { - tt_assert(buf->previous_to_last == previous); tt_assert(buf->last == chain); } tt_assert(chain->buffer_len >= chain->misalign + chain->off); - previous = chain; chain = chain->next; }