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.
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.
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