From: Nick Mathewson Date: Tue, 24 Dec 2013 16:30:06 +0000 (-0500) Subject: Minor optimizations on bufferevent_trigger options X-Git-Tag: release-2.1.4-alpha~60 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a3172a415b709d1df76b27ee86c738e4d8b6f87b;p=libevent Minor optimizations on bufferevent_trigger options By making BEV_TRIG_DEFER_CALLBACKS equal to BEV_OPT_DEFER_CALLBACKS, and BEV_TRIG_IGNORE_WATERMARKS disjoint from BEV_OPT_*, we can save a few operations in bufferevent_run_*, which is critical-path. --- diff --git a/bufferevent.c b/bufferevent.c index 19413369..588461a3 100644 --- a/bufferevent.c +++ b/bufferevent.c @@ -226,8 +226,7 @@ bufferevent_run_readcb_(struct bufferevent *bufev, int options) EVUTIL_UPCAST(bufev, struct bufferevent_private, bev); if (bufev->readcb == NULL) return; - if ((p->options & BEV_OPT_DEFER_CALLBACKS) || - (options & BEV_TRIG_DEFER_CALLBACKS)) { + if ((p->options|options) & BEV_OPT_DEFER_CALLBACKS) { p->readcb_pending = 1; SCHEDULE_DEFERRED(p); } else { @@ -243,8 +242,7 @@ bufferevent_run_writecb_(struct bufferevent *bufev, int options) EVUTIL_UPCAST(bufev, struct bufferevent_private, bev); if (bufev->writecb == NULL) return; - if ((p->options & BEV_OPT_DEFER_CALLBACKS) || - (options & BEV_TRIG_DEFER_CALLBACKS)) { + if ((p->options|options) & BEV_OPT_DEFER_CALLBACKS) { p->writecb_pending = 1; SCHEDULE_DEFERRED(p); } else { @@ -252,11 +250,16 @@ bufferevent_run_writecb_(struct bufferevent *bufev, int options) } } +#define BEV_TRIG_ALL_OPTS ( \ + BEV_TRIG_IGNORE_WATERMARKS| \ + BEV_TRIG_DEFER_CALLBACKS \ + ) + void bufferevent_trigger(struct bufferevent *bufev, short iotype, int options) { bufferevent_incref_and_lock_(bufev); - bufferevent_trigger_nolock_(bufev, iotype, options); + bufferevent_trigger_nolock_(bufev, iotype, options&BEV_TRIG_ALL_OPTS); bufferevent_decref_and_unlock_(bufev); } @@ -268,8 +271,7 @@ bufferevent_run_eventcb_(struct bufferevent *bufev, short what, int options) EVUTIL_UPCAST(bufev, struct bufferevent_private, bev); if (bufev->errorcb == NULL) return; - if ((p->options & BEV_OPT_DEFER_CALLBACKS) || - (options & BEV_TRIG_DEFER_CALLBACKS)) { + if ((p->options|options) & BEV_OPT_DEFER_CALLBACKS) { p->eventcb_pending |= what; p->errno_pending = EVUTIL_SOCKET_ERROR(); SCHEDULE_DEFERRED(p); @@ -282,7 +284,7 @@ void bufferevent_trigger_event(struct bufferevent *bufev, short what, int options) { bufferevent_incref_and_lock_(bufev); - bufferevent_run_eventcb_(bufev, what, options); + bufferevent_run_eventcb_(bufev, what, options&BEV_TRIG_ALL_OPTS); bufferevent_decref_and_unlock_(bufev); } diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index 1026ca9e..07bfd19d 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -564,10 +564,13 @@ int bufferevent_flush(struct bufferevent *bufev, */ enum bufferevent_trigger_options { /** trigger the callback regardless of the watermarks */ - BEV_TRIG_IGNORE_WATERMARKS = (1<<0), + BEV_TRIG_IGNORE_WATERMARKS = (1<<16), /** defer even if the callbacks are not */ - BEV_TRIG_DEFER_CALLBACKS = (1<<1), + BEV_TRIG_DEFER_CALLBACKS = BEV_OPT_DEFER_CALLBACKS, + + /* (Note: for internal reasons, these need to be disjoint from + * bufferevent_options, except when they mean the same thing. */ }; /**