} 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;
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) {
#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