diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-04-13 03:17:19 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-04-13 03:17:19 +0000 |
commit | 915193e7df010fb3f280208b1e7af8c74b462686 (patch) | |
tree | 9268936d9b63db940095418524961996df233067 /bufferevent_pair.c | |
parent | 1becc4c4e656213d0f71938029a08a2da04dc97f (diff) | |
download | libevent-915193e7df010fb3f280208b1e7af8c74b462686.tar.gz |
Locking support for bufferevents.
svn:r1170
Diffstat (limited to 'bufferevent_pair.c')
-rw-r--r-- | bufferevent_pair.c | 10 |
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; |