]> granicus.if.org Git - libevent/commitdiff
Fix byte counts when mixing deferred and non-deferred evbuffer callbacks.
authorNick Mathewson <nickm@torproject.org>
Wed, 6 Jan 2010 23:42:59 +0000 (18:42 -0500)
committerNick Mathewson <nickm@torproject.org>
Wed, 6 Jan 2010 23:42:59 +0000 (18:42 -0500)
This patch finishes 390e0561, which was somehow committed in a half-finished
state.  It solves a failing unit test on windows.

buffer.c
evbuffer-internal.h

index 8bcd48a5e81f2fad7120734b4eaf924db62eadb7..f6c5bca908a6bcec5b89ac7ffc1e43f4aa1baf96 100644 (file)
--- 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) {
index 99dde3cec5405301e76284d6dc1482a05e347d8c..0852d59e4237676af1b946b166a19ba0a43865fd 100644 (file)
@@ -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