From: Nick Mathewson Date: Wed, 6 Jan 2010 23:42:59 +0000 (-0500) Subject: Fix byte counts when mixing deferred and non-deferred evbuffer callbacks. X-Git-Tag: release-2.0.4-alpha~92 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=29151e65b754eb254e6cc3596f006a2de85fd2fb;p=libevent Fix byte counts when mixing deferred and non-deferred evbuffer callbacks. This patch finishes 390e0561, which was somehow committed in a half-finished state. It solves a failing unit test on windows. --- diff --git a/buffer.c b/buffer.c index 8bcd48a5..f6c5bca9 100644 --- a/buffer.c +++ b/buffer.c @@ -341,7 +341,8 @@ evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred) } else if (buffer->deferred_cbs) { mask = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED; masked_val = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED; -/* Don't zero-out n_add/n_del, since */ + /* Don't zero-out n_add/n_del, since the deferred callbacks + will want to see them. */ clear = 0; } else { mask = EVBUFFER_CB_ENABLED; @@ -361,9 +362,10 @@ evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred) info.orig_size = new_size + buffer->n_del_for_cb - buffer->n_add_for_cb; info.n_added = buffer->n_add_for_cb; info.n_deleted = buffer->n_del_for_cb; - buffer->n_add_for_cb = 0; - buffer->n_del_for_cb = 0; - + if (clear) { + buffer->n_add_for_cb = 0; + buffer->n_del_for_cb = 0; + } for (cbent = TAILQ_FIRST(&buffer->callbacks); cbent != TAILQ_END(&buffer->callbacks); cbent = next) { diff --git a/evbuffer-internal.h b/evbuffer-internal.h index 99dde3ce..0852d59e 100644 --- a/evbuffer-internal.h +++ b/evbuffer-internal.h @@ -36,7 +36,9 @@ extern "C" { #include "util-internal.h" #include "defer-internal.h" -/* Experimental cb flag: "never deferred" */ +/* Experimental cb flag: "never deferred." Implementation note: + * these callbacks may get an inaccurate view of n_del/n_added in their + * arguments. */ #define EVBUFFER_CB_NODEFER 2 #ifdef WIN32