summaryrefslogtreecommitdiff
path: root/bufferevent_pair.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-04-13 03:17:19 +0000
committerNick Mathewson <nickm@torproject.org>2009-04-13 03:17:19 +0000
commit915193e7df010fb3f280208b1e7af8c74b462686 (patch)
tree9268936d9b63db940095418524961996df233067 /bufferevent_pair.c
parent1becc4c4e656213d0f71938029a08a2da04dc97f (diff)
downloadlibevent-915193e7df010fb3f280208b1e7af8c74b462686.tar.gz
Locking support for bufferevents.
svn:r1170
Diffstat (limited to 'bufferevent_pair.c')
-rw-r--r--bufferevent_pair.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/bufferevent_pair.c b/bufferevent_pair.c
index 6fed0e03..6080421c 100644
--- a/bufferevent_pair.c
+++ b/bufferevent_pair.c
@@ -75,6 +75,7 @@ run_callback(struct deferred_cb *cb, void *arg)
struct bufferevent_pair *bufev = arg;
struct bufferevent *bev = downcast(bufev);
+ BEV_LOCK(bev);
if (cb == &bufev->deferred_read_cb) {
if (bev->readcb) {
bev->readcb(bev, bev->cbarg);
@@ -84,6 +85,7 @@ run_callback(struct deferred_cb *cb, void *arg)
bev->writecb(bev, bev->cbarg);
}
}
+ BEV_UNLOCK(bev);
}
static struct bufferevent_pair *
@@ -115,16 +117,22 @@ bufferevent_pair_new(struct event_base *base, enum bufferevent_options options,
struct bufferevent *pair[2])
{
struct bufferevent_pair *bufev1 = NULL, *bufev2 = NULL;
+ enum bufferevent_options tmp_options = options & ~BEV_OPT_THREADSAFE;
bufev1 = bufferevent_pair_elt_new(base, options);
if (!bufev1)
return -1;
- bufev2 = bufferevent_pair_elt_new(base, options);
+ bufev2 = bufferevent_pair_elt_new(base, tmp_options);
if (!bufev2) {
bufferevent_free(downcast(bufev1));
return -1;
}
+ if (options & BEV_OPT_THREADSAFE) {
+ /*XXXX check return */
+ bufferevent_enable_locking(downcast(bufev2), bufev1->bev.lock);
+ }
+
bufev1->partner = bufev2;
bufev2->partner = bufev1;