Add a function to retrieve the other side of a bufferevent pair

This commit is contained in:
Nick Mathewson 2010-06-07 12:06:43 -04:00
parent 44d57eee93
commit 17a8e2d72b
3 changed files with 27 additions and 2 deletions

View File

@ -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),

View File

@ -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.

View File

@ -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)