From 17a8e2d72b156f82c7ecaba989a996c943f03042 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 7 Jun 2010 12:06:43 -0400 Subject: [PATCH] Add a function to retrieve the other side of a bufferevent pair --- bufferevent_pair.c | 15 +++++++++++++++ include/event2/bufferevent.h | 9 +++++++-- test/regress_bufferevent.c | 5 +++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/bufferevent_pair.c b/bufferevent_pair.c index b826bc7d..8083b149 100644 --- a/bufferevent_pair.c +++ b/bufferevent_pair.c @@ -306,6 +306,21 @@ be_pair_flush(struct bufferevent *bev, short iotype, return 0; } +struct bufferevent * +bufferevent_pair_get_partner(struct bufferevent *bev) +{ + struct bufferevent_pair *bev_p; + struct bufferevent *partner; + bev_p = upcast(bev); + if (! bev_p) + return NULL; + + incref_and_lock(bev); + partner = downcast(bev_p->partner); + decref_and_unlock(bev); + return partner; +} + const struct bufferevent_ops bufferevent_ops_pair = { "pair_elt", evutil_offsetof(struct bufferevent_pair, bev.bev), diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index 1228adfe..02cabe67 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -523,10 +523,15 @@ bufferevent_filter_new(struct bufferevent *underlying, @param pair A pointer to an array to hold the two new bufferevent objects. @return 0 on success, -1 on failure. */ -int -bufferevent_pair_new(struct event_base *base, int options, +int bufferevent_pair_new(struct event_base *base, int options, struct bufferevent *pair[2]); +/** + Given one bufferevent returned by bufferevent_pair_new(), returns the + other one if it still exists. Otherwise returns NULL. + */ +struct bufferevent *bufferevent_pair_get_partner(struct bufferevent *bev); + /** Abstract type used to configure rate-limiting on a bufferevent or a group of bufferevents. diff --git a/test/regress_bufferevent.c b/test/regress_bufferevent.c index daf6a9a1..df769f5a 100644 --- a/test/regress_bufferevent.c +++ b/test/regress_bufferevent.c @@ -131,11 +131,15 @@ test_bufferevent_impl(int use_pair) bufferevent_setcb(bev2, readcb, writecb, errorcb, NULL); tt_int_op(bufferevent_getfd(bev1), ==, -1); tt_ptr_op(bufferevent_get_underlying(bev1), ==, NULL); + tt_ptr_op(bufferevent_pair_get_partner(bev1), ==, bev2); + tt_ptr_op(bufferevent_pair_get_partner(bev2), ==, bev1); } else { bev1 = bufferevent_new(pair[0], readcb, writecb, errorcb, NULL); bev2 = bufferevent_new(pair[1], readcb, writecb, errorcb, NULL); tt_int_op(bufferevent_getfd(bev1), ==, pair[0]); tt_ptr_op(bufferevent_get_underlying(bev1), ==, NULL); + tt_ptr_op(bufferevent_pair_get_partner(bev1), ==, NULL); + tt_ptr_op(bufferevent_pair_get_partner(bev2), ==, NULL); } bufferevent_disable(bev1, EV_READ); @@ -152,6 +156,7 @@ test_bufferevent_impl(int use_pair) event_dispatch(); bufferevent_free(bev1); + tt_ptr_op(bufferevent_pair_get_partner(bev2), ==, NULL); bufferevent_free(bev2); if (test_ok != 2) -- 2.40.0