]> granicus.if.org Git - libevent/commitdiff
add bufferevent_read_buffer function
authorNiels Provos <provos@gmail.com>
Fri, 25 Apr 2008 02:44:46 +0000 (02:44 +0000)
committerNiels Provos <provos@gmail.com>
Fri, 25 Apr 2008 02:44:46 +0000 (02:44 +0000)
svn:r728

ChangeLog
evbuffer.c
include/event2/bufferevent.h
test/regress.c

index 8659e1003d0aca060501b2f98513b6cf0e7a49b3..6dd51b6615c96108453094edc7d1ad2c1cf23850 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -70,6 +70,7 @@ Changes in current version:
  o Make all event_tagging interfaces threadsafe.
  o Rename internal memory management functions.
  o New functions (event_assign, event_new, event_free) for use by apps that want to be safely threadsafe, or want to remain ignorant of the contents of struct event.
+ o introduce bufferevent_read_buffer; allows reading without memory copy.
 
 Changes in 1.4.0:
  o allow \r or \n individually to separate HTTP headers instead of the standard "\r\n"; from Charles Kerr.
index 712d5c618ac311c5afbc6f17d0fd4ec04f5c192f..bb719b3cd408d49790ec4d3afddec9e59650d26a 100644 (file)
@@ -325,6 +325,12 @@ bufferevent_read(struct bufferevent *bufev, void *data, size_t size)
        return (evbuffer_remove(bufev->input, data, size));
 }
 
+int
+bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf)
+{
+       return (evbuffer_add_buffer(buf, bufev->input));
+}
+
 int
 bufferevent_enable(struct bufferevent *bufev, short event)
 {
index 32c27f4fbd8cc88d08b330e7fa5a0452f694f02e..7ef7e17d19196997c378287133464c48d8ede1dc 100644 (file)
@@ -181,6 +181,16 @@ int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
  */
 size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
 
+/**
+  Read data from a bufferevent buffer into an evbuffer.  This avoids
+  memory copies.
+
+  @param bufev the bufferevent to be read from
+  @param buf the evbuffer to which to add data
+  @return 0 if successful, or -1 if an error occurred.
+ */
+int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf);
+
 /**
   Enable a bufferevent.
 
index 573cc8c28de1fa18fd0510d0011c059f04500479..9c2b7226a82a986c906b32a9e9709ded0cc004aa 100644 (file)
@@ -1306,8 +1306,18 @@ static void
 readcb(struct bufferevent *bev, void *arg)
 {
        if (EVBUFFER_LENGTH(bev->input) == 8333) {
+               struct evbuffer *evbuf = evbuffer_new();
+               assert(evbuf != NULL);
+
+               /* gratuitous test of bufferevent_read_buffer */
+               bufferevent_read_buffer(bev, evbuf);
+
                bufferevent_disable(bev, EV_READ);
-               test_ok++;
+
+               if (EVBUFFER_LENGTH(evbuf) == 8333)
+                       test_ok++;
+
+               evbuffer_free(evbuf);
        }
 }