diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-04-13 03:08:11 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-04-13 03:08:11 +0000 |
commit | 1becc4c4e656213d0f71938029a08a2da04dc97f (patch) | |
tree | 43cb05c8dae5259aea417e5f911de6dd870bf529 /bufferevent_pair.c | |
parent | 6567ecd4c587563be843ee8803417b53d3318cbd (diff) | |
download | libevent-1becc4c4e656213d0f71938029a08a2da04dc97f.tar.gz |
Refactor new elements of bufferevent into bufferevent_private structure
This way we don't expose more of a bufferevent than we need to. One
motivation is to make it easier to automatically get deferred callbacks
with a bufferevent without exposing the deferred_cb structure.
svn:r1169
Diffstat (limited to 'bufferevent_pair.c')
-rw-r--r-- | bufferevent_pair.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/bufferevent_pair.c b/bufferevent_pair.c index 2551d3de..6fed0e03 100644 --- a/bufferevent_pair.c +++ b/bufferevent_pair.c @@ -42,7 +42,7 @@ #include "util-internal.h" struct bufferevent_pair { - struct bufferevent bev; + struct bufferevent_private bev; struct bufferevent_pair *partner; struct deferred_cb deferred_write_cb; struct deferred_cb deferred_read_cb; @@ -57,12 +57,12 @@ upcast(struct bufferevent *bev) struct bufferevent_pair *bev_p; if (bev->be_ops != &bufferevent_ops_pair) return NULL; - bev_p = EVUTIL_UPCAST(bev, struct bufferevent_pair, bev); - assert(bev_p->bev.be_ops == &bufferevent_ops_pair); + bev_p = EVUTIL_UPCAST(bev, struct bufferevent_pair, bev.bev); + assert(bev_p->bev.bev.be_ops == &bufferevent_ops_pair); return bev_p; } -#define downcast(bev_pair) (&(bev_pair)->bev) +#define downcast(bev_pair) (&(bev_pair)->bev.bev) /* XXX Handle close */ @@ -100,7 +100,7 @@ bufferevent_pair_elt_new(struct event_base *base, } /* XXX set read timeout event */ /* XXX set write timeout event */ - if (!evbuffer_add_cb(bufev->bev.output, be_pair_outbuf_cb, bufev)) { + if (!evbuffer_add_cb(bufev->bev.bev.output, be_pair_outbuf_cb, bufev)) { bufferevent_free(downcast(bufev)); return NULL; } @@ -128,10 +128,10 @@ bufferevent_pair_new(struct event_base *base, enum bufferevent_options options, bufev1->partner = bufev2; bufev2->partner = bufev1; - evbuffer_freeze(bufev1->bev.input, 0); - evbuffer_freeze(bufev1->bev.output, 1); - evbuffer_freeze(bufev2->bev.input, 0); - evbuffer_freeze(bufev2->bev.output, 1); + evbuffer_freeze(downcast(bufev1)->input, 0); + evbuffer_freeze(downcast(bufev1)->output, 1); + evbuffer_freeze(downcast(bufev2)->input, 0); + evbuffer_freeze(downcast(bufev2)->output, 1); pair[0] = downcast(bufev1); pair[1] = downcast(bufev2); @@ -180,11 +180,13 @@ done: } static inline int -be_pair_wants_to_talk(struct bufferevent *src, struct bufferevent *dst) +be_pair_wants_to_talk(struct bufferevent_pair *src, + struct bufferevent_pair *dst) { - return (src->enabled & EV_WRITE) && - (dst->enabled & EV_READ) && !dst->read_suspended && - evbuffer_get_length(src->output); + return (downcast(src)->enabled & EV_WRITE) && + (downcast(dst)->enabled & EV_READ) && + !dst->bev.read_suspended && + evbuffer_get_length(downcast(src)->output); } static void @@ -197,8 +199,7 @@ be_pair_outbuf_cb(struct evbuffer *outbuf, if (info->n_added > info->n_deleted && partner) { /* We got more data. If the other side's reading, then hand it over. */ - if (be_pair_wants_to_talk(downcast(bev_pair), - downcast(partner))) { + if (be_pair_wants_to_talk(bev_pair, partner)) { be_pair_transfer(downcast(bev_pair), downcast(partner), 0); } } @@ -212,12 +213,12 @@ be_pair_enable(struct bufferevent *bufev, short events) /* We're starting to read! Does the other side have anything to write?*/ if ((events & EV_READ) && partner && - be_pair_wants_to_talk(downcast(partner), bufev)) { + be_pair_wants_to_talk(partner, bev_p)) { be_pair_transfer(downcast(partner), bufev, 0); } /* We're starting to write! Does the other side want to read? */ if ((events & EV_WRITE) && partner && - be_pair_wants_to_talk(bufev, downcast(partner))) { + be_pair_wants_to_talk(bev_p, partner)) { be_pair_transfer(bufev, downcast(partner), 0); } return 0; |