summaryrefslogtreecommitdiff
path: root/bufferevent.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-12-24 11:30:06 -0500
committerNick Mathewson <nickm@torproject.org>2013-12-24 11:30:06 -0500
commita3172a415b709d1df76b27ee86c738e4d8b6f87b (patch)
tree9573773ae090be17b7db4dab0bc71fb25bd8cadd /bufferevent.c
parent4dd3abd41fe951b4c236c8e9920f17f3af7f4a6d (diff)
downloadlibevent-a3172a415b709d1df76b27ee86c738e4d8b6f87b.tar.gz
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.
Diffstat (limited to 'bufferevent.c')
-rw-r--r--bufferevent.c18
1 files changed, 10 insertions, 8 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);
}