summaryrefslogtreecommitdiff
path: root/bufferevent.c
diff options
context:
space:
mode:
authorOndřej Kuzník <ondra@mistotebe.net>2013-12-03 22:49:57 +0000
committerOndřej Kuzník <ondra@mistotebe.net>2013-12-03 23:39:13 +0000
commit61ee18b8b1d2ac0025955b3f949531c712fb7527 (patch)
tree78b005fea5cec5daebe28d38ad1b74a5f3b3b3af /bufferevent.c
parent4ce242bd0087ed3f6d36c64d0d15094d8a6fc9fc (diff)
downloadlibevent-61ee18b8b1d2ac0025955b3f949531c712fb7527.tar.gz
Add an option to trigger bufferevent I/O callbacks
Diffstat (limited to 'bufferevent.c')
-rw-r--r--bufferevent.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/bufferevent.c b/bufferevent.c
index 96ce109f..fd95941b 100644
--- a/bufferevent.c
+++ b/bufferevent.c
@@ -219,14 +219,15 @@ bufferevent_run_deferred_callbacks_unlocked(struct event_callback *cb, void *arg
void
-bufferevent_run_readcb_(struct bufferevent *bufev)
+bufferevent_run_readcb_(struct bufferevent *bufev, int options)
{
/* Requires that we hold the lock and a reference */
struct bufferevent_private *p =
EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
if (bufev->readcb == NULL)
return;
- if (p->options & BEV_OPT_DEFER_CALLBACKS) {
+ if ((p->options & BEV_OPT_DEFER_CALLBACKS) ||
+ (options & BEV_TRIG_DEFER_CALLBACKS)) {
p->readcb_pending = 1;
SCHEDULE_DEFERRED(p);
} else {
@@ -235,14 +236,15 @@ bufferevent_run_readcb_(struct bufferevent *bufev)
}
void
-bufferevent_run_writecb_(struct bufferevent *bufev)
+bufferevent_run_writecb_(struct bufferevent *bufev, int options)
{
/* Requires that we hold the lock and a reference */
struct bufferevent_private *p =
EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
if (bufev->writecb == NULL)
return;
- if (p->options & BEV_OPT_DEFER_CALLBACKS) {
+ if ((p->options & BEV_OPT_DEFER_CALLBACKS) ||
+ (options & BEV_TRIG_DEFER_CALLBACKS)) {
p->writecb_pending = 1;
SCHEDULE_DEFERRED(p);
} else {
@@ -251,6 +253,25 @@ bufferevent_run_writecb_(struct bufferevent *bufev)
}
void
+bufferevent_trigger_nolock_(struct bufferevent *bufev, short iotype, int options)
+{
+ if ((iotype & EV_READ) && ((options & BEV_TRIG_IGNORE_WATERMARKS) ||
+ evbuffer_get_length(bufev->input) >= bufev->wm_read.low))
+ bufferevent_run_readcb_(bufev, options);
+ if ((iotype & EV_WRITE) && ((options & BEV_TRIG_IGNORE_WATERMARKS) ||
+ evbuffer_get_length(bufev->output) <= bufev->wm_write.low))
+ bufferevent_run_writecb_(bufev, options);
+}
+
+void
+bufferevent_trigger(struct bufferevent *bufev, short iotype, int options)
+{
+ bufferevent_incref_and_lock_(bufev);
+ bufferevent_trigger_nolock_(bufev, iotype, options);
+ bufferevent_decref_and_unlock_(bufev);
+}
+
+void
bufferevent_run_eventcb_(struct bufferevent *bufev, short what)
{
/* Requires that we hold the lock and a reference */
@@ -322,20 +343,18 @@ bufferevent_init_common_(struct bufferevent_private *bufev_private,
event_warnx("UNLOCK_CALLBACKS requires DEFER_CALLBACKS");
return -1;
}
- if (options & BEV_OPT_DEFER_CALLBACKS) {
- if (options & BEV_OPT_UNLOCK_CALLBACKS)
- event_deferred_cb_init_(
- &bufev_private->deferred,
- event_base_get_npriorities(base) / 2,
- bufferevent_run_deferred_callbacks_unlocked,
- bufev_private);
- else
- event_deferred_cb_init_(
- &bufev_private->deferred,
- event_base_get_npriorities(base) / 2,
- bufferevent_run_deferred_callbacks_locked,
- bufev_private);
- }
+ if (options & BEV_OPT_UNLOCK_CALLBACKS)
+ event_deferred_cb_init_(
+ &bufev_private->deferred,
+ event_base_get_npriorities(base) / 2,
+ bufferevent_run_deferred_callbacks_unlocked,
+ bufev_private);
+ else
+ event_deferred_cb_init_(
+ &bufev_private->deferred,
+ event_base_get_npriorities(base) / 2,
+ bufferevent_run_deferred_callbacks_locked,
+ bufev_private);
bufev_private->options = options;