summaryrefslogtreecommitdiff
path: root/bufferevent.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-11-17 20:31:09 +0000
committerNick Mathewson <nickm@torproject.org>2009-11-17 20:31:09 +0000
commitd7d1f1da09f32a14ff4c08dc0f1f0e0673ed5afd (patch)
treed02c3c5d7a4a50299aeaae5c3b7ea41d7cce6945 /bufferevent.c
parent201d8d0bafeb2ba1388746ed745cd5d8defb3689 (diff)
downloadlibevent-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.c12
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);
}