]> granicus.if.org Git - libevent/commitdiff
fix a bug in which bufferevent_write_buffer would not schedule a write event
authorNiels Provos <provos@gmail.com>
Sat, 26 Apr 2008 05:13:56 +0000 (05:13 +0000)
committerNiels Provos <provos@gmail.com>
Sat, 26 Apr 2008 05:13:56 +0000 (05:13 +0000)
svn:r733

ChangeLog
evbuffer.c

index 35c9a90e94c2e3bf4e5fcca1dbf8fe6e7bb5b449..ac99ef3479777189f2e23234fab6aa00ef96b4ee 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -73,6 +73,7 @@ Changes in current version:
  o introduce bufferevent_read_buffer; allows reading without memory copy.
  o expose bufferevent_setwatermark via header files and fix high watermark on read
  o fix a bug in buffrevent read water marks and add a test for them
+ o fix a bug in which bufferevent_write_buffer would not schedule a write event
 
 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 9b99e5362118b63f498ac84a9cdd8c326a08788b..f5667bd21c0551b69920661dd42ba4d62ca06399 100644 (file)
@@ -298,6 +298,14 @@ bufferevent_free(struct bufferevent *bufev)
        mm_free(bufev);
 }
 
+static inline void
+bufferevent_write_closure(struct bufferevent *bufev, int progress)
+{
+       /* If everything is okay, we need to schedule a write */
+       if (progress && (bufev->enabled & EV_WRITE))
+               bufferevent_add(&bufev->ev_write, bufev->timeout_write);
+}
+
 /*
  * Returns 0 on success;
  *        -1 on failure.
@@ -306,24 +314,25 @@ bufferevent_free(struct bufferevent *bufev)
 int
 bufferevent_write(struct bufferevent *bufev, const void *data, size_t size)
 {
-       int res;
-
-       res = evbuffer_add(bufev->output, data, size);
-
-       if (res == -1)
-               return (res);
+       if (evbuffer_add(bufev->output, data, size) == -1)
+               return (-1);
 
-       /* If everything is okay, we need to schedule a write */
-       if (size > 0 && (bufev->enabled & EV_WRITE))
-               bufferevent_add(&bufev->ev_write, bufev->timeout_write);
+       bufferevent_write_closure(bufev, size > 0);
 
-       return (res);
+       return (0);
 }
 
 int
 bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf)
 {
-       return (evbuffer_add_buffer(bufev->output, buf));
+       int len = EVBUFFER_LENGTH(bufev->output);
+
+       if (evbuffer_add_buffer(bufev->output, buf) == -1)
+               return (-1);
+
+       bufferevent_write_closure(bufev, len > 0);
+       
+       return (0);
 }
 
 size_t