aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-12-21 15:42:58 -0500
committerNick Mathewson <nickm@torproject.org>2018-12-21 15:42:58 -0500
commit99713b176b3713c3960be7b2852ffdb301daa916 (patch)
tree9d749735e8889057eba67330c44c5ff2d98237ab /src/core
parent70dd6d07bbd7c233e9f39e24b27775eae77f2363 (diff)
parenta9eec3364919a8e555631ef1654a016f1f00d59c (diff)
downloadtor-99713b176b3713c3960be7b2852ffdb301daa916.tar.gz
tor-99713b176b3713c3960be7b2852ffdb301daa916.zip
Merge branch 'maint-0.3.5'
Diffstat (limited to 'src/core')
-rw-r--r--src/core/mainloop/mainloop.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c
index 834587bb71..a2e1080720 100644
--- a/src/core/mainloop/mainloop.c
+++ b/src/core/mainloop/mainloop.c
@@ -377,6 +377,9 @@ connection_unlink(connection_t *conn)
connection_free(conn);
}
+/** Event that invokes schedule_active_linked_connections_cb. */
+static mainloop_event_t *schedule_active_linked_connections_event = NULL;
+
/**
* Callback: used to activate read events for all linked connections, so
* libevent knows to call their read callbacks. This callback run as a
@@ -393,10 +396,18 @@ schedule_active_linked_connections_cb(mainloop_event_t *event, void *arg)
* so that libevent knows to run their callbacks. */
SMARTLIST_FOREACH(active_linked_connection_lst, connection_t *, conn,
event_active(conn->read_event, EV_READ, 1));
-}
-/** Event that invokes schedule_active_linked_connections_cb. */
-static mainloop_event_t *schedule_active_linked_connections_event = NULL;
+ /* Reactivate the event if we still have connections in the active list.
+ *
+ * A linked connection doesn't get woken up by I/O but rather artificially
+ * by this event callback. It has directory data spooled in it and it is
+ * sent incrementally by small chunks unless spool_eagerly is true. For that
+ * to happen, we need to induce the activation of the read event so it can
+ * be flushed. */
+ if (smartlist_len(active_linked_connection_lst)) {
+ mainloop_event_activate(schedule_active_linked_connections_event);
+ }
+}
/** Initialize the global connection list, closeable connection list,
* and active connection list. */