[tor-commits] [tor/master] Give queued_events_flush_all() responsibility for flushing log cbs

nickm at torproject.org nickm at torproject.org
Thu May 3 15:59:36 UTC 2018


commit 0d8604c76306ea95e7918af67cf268d630aea941
Author: Nick Mathewson <nickm at torproject.org>
Date:   Tue May 1 10:26:04 2018 -0400

    Give queued_events_flush_all() responsibility for flushing log cbs
    
    This requires that when a log cb happens, the event for flushing
    queued events is scheduled, so we also add the necessary machinery
    to have that happen.
    
    Note that this doesn't actually help with logs from outside the main
    thread, but those were already suppressed: see #25987 for a ticket
    tracking that issue.
---
 src/or/config.c  |  1 +
 src/or/control.c | 22 +++++++++++++++++++++-
 src/or/control.h |  1 +
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/or/config.c b/src/or/config.c
index 54f3930fc..208680060 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1547,6 +1547,7 @@ options_act_reversible(const or_options_t *old_options, char **msg)
       tor_malloc_zero(sizeof(log_severity_list_t));
     close_temp_logs();
     add_callback_log(severity, control_event_logmsg);
+    logs_set_pending_callback_callback(control_event_logmsg_pending);
     control_adjust_event_log_severity();
     tor_free(severity);
     tor_log_update_sigsafe_err_fds();
diff --git a/src/or/control.c b/src/or/control.c
index dda887218..7ad9460cc 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -803,6 +803,9 @@ queued_event_free_(queued_event_t *ev)
 static void
 queued_events_flush_all(int force)
 {
+  /* Make sure that we get all the pending log events, if there are any. */
+  flush_pending_log_callbacks();
+
   if (PREDICT_UNLIKELY(queued_control_events == NULL)) {
     return;
   }
@@ -6186,7 +6189,7 @@ control_event_logmsg(int severity, uint32_t domain, const char *msg)
   int event;
 
   /* Don't even think of trying to add stuff to a buffer from a cpuworker
-   * thread. */
+   * thread. (See #25987 for plan to fix.) */
   if (! in_main_thread())
     return;
 
@@ -6232,6 +6235,23 @@ control_event_logmsg(int severity, uint32_t domain, const char *msg)
   }
 }
 
+/**
+ * Logging callback: called when there is a queued pending log callback.
+ */
+void
+control_event_logmsg_pending(void)
+{
+  if (! in_main_thread()) {
+    /* We can't handle this case yet, since we're using a
+     * mainloop_event_t to invoke queued_events_flush_all.  We ought to
+     * use a different mechanism instead: see #25987.
+     **/
+    return;
+  }
+  tor_assert(flush_queued_events_event);
+  mainloop_event_activate(flush_queued_events_event);
+}
+
 /** Called whenever we receive new router descriptors: tell any
  * interested control connections.  <b>routers</b> is a list of
  * routerinfo_t's.
diff --git a/src/or/control.h b/src/or/control.h
index 2f312a663..7f8a0bdb5 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -60,6 +60,7 @@ int control_event_conn_bandwidth(connection_t *conn);
 int control_event_conn_bandwidth_used(void);
 int control_event_circuit_cell_stats(void);
 void control_event_logmsg(int severity, uint32_t domain, const char *msg);
+void control_event_logmsg_pending(void);
 int control_event_descriptors_changed(smartlist_t *routers);
 int control_event_address_mapped(const char *from, const char *to,
                                  time_t expires, const char *error,





More information about the tor-commits mailing list