o Fix preamble of rpcgen-generated files to rely on event2 includes; based on work by jmansion; patch from Zack Weinberg.
o Allow specifying the output filename for rpcgen; based on work by jmansion; patch from Zack Weinberg.
o Allow C identifiers as struct names; allow multiple comments in .rpc files; from Zack Weinberg
+ o Mitigate a race condition when using socket bufferevents in multiple threads.
Changes in 2.0.1-alpha:
bufferevent_generic_read_timeout_cb(evutil_socket_t fd, short event, void *ctx)
{
struct bufferevent *bev = ctx;
+ BEV_LOCK(bev);
_bufferevent_run_eventcb(bev, BEV_EVENT_TIMEOUT|BEV_EVENT_READING);
+ BEV_UNLOCK(bev);
}
static void
bufferevent_generic_write_timeout_cb(evutil_socket_t fd, short event, void *ctx)
{
struct bufferevent *bev = ctx;
+ BEV_LOCK(bev);
_bufferevent_run_eventcb(bev, BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING);
+ BEV_UNLOCK(bev);
}
void
short what = BEV_EVENT_READING;
int howmuch = -1;
+ BEV_LOCK(arg);
+
if (event == EV_TIMEOUT) {
what |= BEV_EVENT_TIMEOUT;
goto error;
/* we somehow lowered the watermark, stop reading */
if (howmuch <= 0) {
bufferevent_wm_suspend_read(bufev);
- return;
+ goto done;
}
}
bufev->readcb != NULL)
_bufferevent_run_readcb(bufev);
- return;
+ goto done;
reschedule:
- return;
+ goto done;
error:
event_del(&bufev->ev_read);
_bufferevent_run_eventcb(bufev, what);
+
+ done:
+ BEV_UNLOCK(bufev);
}
static void
int res = 0;
short what = BEV_EVENT_WRITING;
+ BEV_LOCK(bufev);
+
if (event == EV_TIMEOUT) {
what |= BEV_EVENT_TIMEOUT;
goto error;
_bufferevent_run_eventcb(bufev, BEV_EVENT_CONNECTED);
if (!(bufev->enabled & EV_WRITE)) {
event_del(&bufev->ev_write);
- return;
+ goto done;
}
}
evbuffer_get_length(bufev->output) <= bufev->wm_write.low)
_bufferevent_run_writecb(bufev);
- return;
+ goto done;
reschedule:
if (evbuffer_get_length(bufev->output) == 0)
event_del(&bufev->ev_write);
- return;
+ goto done;
error:
event_del(&bufev->ev_write);
_bufferevent_run_eventcb(bufev, what);
+
+ done:
+ BEV_UNLOCK(bufev);
}
struct bufferevent *