From a3172a415b709d1df76b27ee86c738e4d8b6f87b Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 24 Dec 2013 11:30:06 -0500 Subject: [PATCH] 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. --- bufferevent.c | 18 ++++++++++-------- include/event2/bufferevent.h | 7 +++++-- 2 files changed, 15 insertions(+), 10 deletions(-) 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. */ }; /** -- 2.40.0