From 89f63b205d29b9ff9642713d22ca59427c1ffab5 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Fri, 25 Apr 2008 02:44:46 +0000 Subject: [PATCH] add bufferevent_read_buffer function svn:r728 --- ChangeLog | 1 + evbuffer.c | 6 ++++++ include/event2/bufferevent.h | 10 ++++++++++ test/regress.c | 12 +++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 8659e100..6dd51b66 100644 --- 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. diff --git a/evbuffer.c b/evbuffer.c index 712d5c61..bb719b3c 100644 --- a/evbuffer.c +++ b/evbuffer.c @@ -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) { diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index 32c27f4f..7ef7e17d 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -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. diff --git a/test/regress.c b/test/regress.c index 573cc8c2..9c2b7226 100644 --- a/test/regress.c +++ b/test/regress.c @@ -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); } } -- 2.40.0