]> granicus.if.org Git - libevent/commitdiff
Add a function to retrieve the other side of a bufferevent pair
authorNick Mathewson <nickm@torproject.org>
Mon, 7 Jun 2010 16:06:43 +0000 (12:06 -0400)
committerNick Mathewson <nickm@torproject.org>
Mon, 7 Jun 2010 16:06:43 +0000 (12:06 -0400)
bufferevent_pair.c
include/event2/bufferevent.h
test/regress_bufferevent.c

index b826bc7de638516e3542fe5e49ac385fb91649a3..8083b14941f17ddb927ea18f92a230593c3e8a01 100644 (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),
index 1228adfe026dec8ed6aaf20da8fa88ab97082e29..02cabe67ea311c7b4f5d7b4c5e44eca02d7e5e2d 100644 (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.
index daf6a9a11001e4526f1d09bb1cf2886574a06916..df769f5a8bdb573e3221166e97938288f41502f4 100644 (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)