diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-11-17 20:31:09 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-11-17 20:31:09 +0000 |
commit | d7d1f1da09f32a14ff4c08dc0f1f0e0673ed5afd (patch) | |
tree | d02c3c5d7a4a50299aeaae5c3b7ea41d7cce6945 /bufferevent.c | |
parent | 201d8d0bafeb2ba1388746ed745cd5d8defb3689 (diff) | |
download | libevent-d7d1f1da09f32a14ff4c08dc0f1f0e0673ed5afd.tar.gz |
Move responsibility for IOCP callback into bufferevent_async.
This patch from Chris Davis saves some callback depth, and adds proper
ref-counting to bufferevents when there's a deferred evbuffer callback
inflight. It could use a couple more comments to really nail down what
its invariants are.
svn:r1543
Diffstat (limited to 'bufferevent.c')
-rw-r--r-- | bufferevent.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/bufferevent.c b/bufferevent.c index f291f29f..39a062c1 100644 --- a/bufferevent.c +++ b/bufferevent.c @@ -47,14 +47,16 @@ #include <errno.h> #include "event2/util.h" -#include "event2/bufferevent.h" #include "event2/buffer.h" +#include "event2/buffer_compat.h" +#include "event2/bufferevent.h" #include "event2/bufferevent_struct.h" #include "event2/bufferevent_compat.h" #include "event2/event.h" #include "log-internal.h" #include "mm-internal.h" #include "bufferevent-internal.h" +#include "evbuffer-internal.h" #include "util-internal.h" void @@ -257,6 +259,9 @@ bufferevent_init_common(struct bufferevent_private *bufev_private, bufev_private->options = options; + evbuffer_set_parent(bufev->input, bufev); + evbuffer_set_parent(bufev->output, bufev); + return 0; } @@ -494,6 +499,9 @@ _bufferevent_decref_and_unlock(struct bufferevent *bufev) if (bufev->be_ops->destruct) bufev->be_ops->destruct(bufev); + /* XXX what happens if refcnt for these buffers is > 1? + * The buffers can share a lock with this bufferevent object, + * but the lock might be destroyed below. */ /* evbuffer will free the callbacks */ evbuffer_free(bufev->input); evbuffer_free(bufev->output); @@ -631,7 +639,7 @@ _bufferevent_init_generic_timeout_cbs(struct bufferevent *bev) { evtimer_assign(&bev->ev_read, bev->ev_base, bufferevent_generic_read_timeout_cb, bev); - evtimer_assign(&bev->ev_read, bev->ev_base, + evtimer_assign(&bev->ev_write, bev->ev_base, bufferevent_generic_write_timeout_cb, bev); } |