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.
This commit is contained in:
Nick Mathewson 2010-01-06 18:42:59 -05:00
parent ba2945f931
commit 29151e65b7
2 changed files with 9 additions and 5 deletions

View File

@ -341,7 +341,8 @@ evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred)
} else if (buffer->deferred_cbs) { } else if (buffer->deferred_cbs) {
mask = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED; mask = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED;
masked_val = 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; clear = 0;
} else { } else {
mask = EVBUFFER_CB_ENABLED; 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.orig_size = new_size + buffer->n_del_for_cb - buffer->n_add_for_cb;
info.n_added = buffer->n_add_for_cb; info.n_added = buffer->n_add_for_cb;
info.n_deleted = buffer->n_del_for_cb; info.n_deleted = buffer->n_del_for_cb;
buffer->n_add_for_cb = 0; if (clear) {
buffer->n_del_for_cb = 0; buffer->n_add_for_cb = 0;
buffer->n_del_for_cb = 0;
}
for (cbent = TAILQ_FIRST(&buffer->callbacks); for (cbent = TAILQ_FIRST(&buffer->callbacks);
cbent != TAILQ_END(&buffer->callbacks); cbent != TAILQ_END(&buffer->callbacks);
cbent = next) { cbent = next) {

View File

@ -36,7 +36,9 @@ extern "C" {
#include "util-internal.h" #include "util-internal.h"
#include "defer-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 #define EVBUFFER_CB_NODEFER 2
#ifdef WIN32 #ifdef WIN32