]> granicus.if.org Git - libevent/commitdiff
introduce evbuffer_contiguous_space() and use it in the zlib filter test
authorNiels Provos <provos@gmail.com>
Sat, 3 May 2008 02:37:18 +0000 (02:37 +0000)
committerNiels Provos <provos@gmail.com>
Sat, 3 May 2008 02:37:18 +0000 (02:37 +0000)
svn:r756

ChangeLog
buffer.c
include/event2/buffer.h
test/regress_zlib.c

index 1420a900bacfc33e15e46ad28c87431ce40944b3..c31573ed1b3a62a9790f5b6a373fe731163b9303 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -83,7 +83,8 @@ Changes in current version:
  o allow connections to be removed from an rpc pool
  o add new evtimer_assign, signal_assign, evtimer_new, and signal_new functions to manipulate timer and signal events, analagous to the now-recommended event_assign and event_new
  o switch internal uses of event_set over to use event_assign.
-        
+ o introduce evbuffer_contiguous_space() api that tells a user how much data is available in the first buffer chain
+       
 Changes in 1.4.0:
  o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
  o demote most http warnings to debug messages
index e03c00af1e3724122de8b0ff646c19ebc3c3563e..20dfb160fd8bca3c48273e0116a525d8b72c2d39 100644 (file)
--- a/buffer.c
+++ b/buffer.c
@@ -123,6 +123,14 @@ evbuffer_length(struct evbuffer *buffer)
        return (buffer->total_len);
 }
 
+size_t
+evbuffer_contiguous_space(struct evbuffer *buf)
+{
+       struct evbuffer_chain *chain = buf->first;
+
+       return (chain != NULL ? chain->off : 0);
+}
+
 #define ZERO_CHAIN(dst) do { \
                (dst)->first = NULL;            \
                (dst)->last = NULL;             \
index 2b77b5d15f7120b76f0413f56f628ebea116421e..637cc2e0ff13f1c88e68b6579921b69e13c090a9 100644 (file)
@@ -93,6 +93,19 @@ void evbuffer_free(struct evbuffer *buf);
 */
 size_t evbuffer_length(struct evbuffer *buf);
 
+/**
+   Returns the contiguous number of available bytes in the first buffer chain.
+
+   This is useful when processing of all available data can be split up into
+   chunks.  Calls to evbuffer_pullup() that cause reallocation and copying
+   of data can thus be avoided.
+
+   @param buf pointer to the evbuffer
+   @return 0 if no data is available, otherwise the number of available bytes
+     in the first buffer chain.
+*/
+size_t evbuffer_contiguous_space(struct evbuffer *buf);
+
 /**
   Expands the available space in an event buffer.
 
index 9455bc676959e6c92902214580f96473a703cd68..434054c4e82dc5293912227515c9edf9e1109a2c 100644 (file)
@@ -111,7 +111,7 @@ zlib_input_filter(struct evbuffer *src, struct evbuffer *dst,
 
        do {
                /* let's do some decompression */
-               p->avail_in = EVBUFFER_LENGTH(src);
+               p->avail_in = evbuffer_contiguous_space(src);
                p->next_in = evbuffer_pullup(src, p->avail_in);
 
                p->next_out = (unsigned char *)tmp;
@@ -123,7 +123,7 @@ zlib_input_filter(struct evbuffer *src, struct evbuffer *dst,
                assert(res == Z_OK || res == Z_STREAM_END);
 
                /* let's figure out how much was compressed */
-               nread = EVBUFFER_LENGTH(src) - p->avail_in;
+               nread = evbuffer_contiguous_space(src) - p->avail_in;
                nwrite = sizeof(tmp) - p->avail_out;
 
                evbuffer_drain(src, nread);
@@ -147,7 +147,7 @@ zlib_output_filter(struct evbuffer *src, struct evbuffer *dst,
 
        do {
                /* let's do some compression */
-               p->avail_in = EVBUFFER_LENGTH(src);
+               p->avail_in = evbuffer_contiguous_space(src);
                p->next_in = evbuffer_pullup(src, p->avail_in);
 
                p->next_out = (unsigned char *)tmp;
@@ -158,7 +158,7 @@ zlib_output_filter(struct evbuffer *src, struct evbuffer *dst,
                assert(res == Z_OK || res == Z_STREAM_END);
 
                /* let's figure out how much was compressed */
-               nread = EVBUFFER_LENGTH(src) - p->avail_in;
+               nread = evbuffer_contiguous_space(src) - p->avail_in;
                nwrite = sizeof(tmp) - p->avail_out;
 
                evbuffer_drain(src, nread);
@@ -246,7 +246,9 @@ test_bufferevent_zlib(void)
        for (i = 0; i < sizeof(buffer); i++)
                buffer[i] = i;
 
-       bufferevent_write(bev1, buffer, sizeof(buffer));
+       /* break it up into multiple buffer chains */
+       bufferevent_write(bev1, buffer, 1800);
+       bufferevent_write(bev1, buffer + 1800, sizeof(buffer) - 1800);
 
        /* we are done writing - we need to flush everything */
        bufferevent_trigger_filter(bev1, NULL, BEV_OUTPUT, BEV_FLUSH);
@@ -256,7 +258,7 @@ test_bufferevent_zlib(void)
        bufferevent_free(bev1);
        bufferevent_free(bev2);
 
-       if (test_ok != 5) {
+       if (test_ok != 6) {
                fprintf(stdout, "FAILED: %d\n", test_ok);
                exit(1);
        }