[tor-commits] [tor/master] Make can_complete_circuits a static variable.

nickm at torproject.org nickm at torproject.org
Thu Nov 20 17:05:32 UTC 2014


commit 336c856e52d211aad6b40d29986264f3277a1327
Author: Nick Mathewson <nickm at torproject.org>
Date:   Thu Nov 20 12:03:46 2014 -0500

    Make can_complete_circuits a static variable.
---
 changes/no_global_ccc |    3 +++
 src/or/circuitbuild.c |    7 ++++---
 src/or/config.c       |    4 ++--
 src/or/control.c      |    2 +-
 src/or/main.c         |   46 ++++++++++++++++++++++++++++++++++++----------
 src/or/main.h         |    4 +++-
 src/or/nodelist.c     |    2 +-
 src/or/rendservice.c  |    2 +-
 8 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/changes/no_global_ccc b/changes/no_global_ccc
new file mode 100644
index 0000000..614055a
--- /dev/null
+++ b/changes/no_global_ccc
@@ -0,0 +1,3 @@
+  o Code Simplification and Refactoring:
+    - Stop using can_complete_circuits as a global variable; access it with
+      a function instead.
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 42c4870..34934dc 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -943,9 +943,9 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
       circuit_rep_hist_note_result(circ);
       circuit_has_opened(circ); /* do other actions as necessary */
 
-      if (!can_complete_circuit && !circ->build_state->onehop_tunnel) {
+      if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) {
         const or_options_t *options = get_options();
-        can_complete_circuit=1;
+        note_that_we_completed_a_circuit();
         /* FFFF Log a count of known routers here */
         log_notice(LD_GENERAL,
             "Tor has successfully opened a circuit. "
@@ -1033,7 +1033,8 @@ circuit_note_clock_jumped(int seconds_elapsed)
       seconds_elapsed >=0 ? "forward" : "backward");
   control_event_general_status(LOG_WARN, "CLOCK_JUMPED TIME=%d",
                                seconds_elapsed);
-  can_complete_circuit=0; /* so it'll log when it works again */
+  /* so we log when it works again */
+  note_that_we_maybe_cant_complete_circuits();
   control_event_client_status(severity, "CIRCUIT_NOT_ESTABLISHED REASON=%s",
                               "CLOCK_JUMPED");
   circuit_mark_all_unused_circs();
diff --git a/src/or/config.c b/src/or/config.c
index 5b62c56..e08c09d 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1072,7 +1072,7 @@ options_act_reversible(const or_options_t *old_options, char **msg)
                  "connections.");
       connection_mark_all_noncontrol_connections();
       /* We can't complete circuits until the network is re-enabled. */
-      can_complete_circuit = 0;
+      note_that_we_maybe_cant_complete_circuits();
     }
   }
 
@@ -1670,7 +1670,7 @@ options_act(const or_options_t *old_options)
 
       if (server_mode(options) && !server_mode(old_options)) {
         ip_address_changed(0);
-        if (can_complete_circuit || !any_predicted_circuits(time(NULL)))
+        if (have_completed_a_circuit() || !any_predicted_circuits(time(NULL)))
           inform_testing_reachability();
       }
       cpuworkers_rotate();
diff --git a/src/or/control.c b/src/or/control.c
index 54464cc..72c6227 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -2015,7 +2015,7 @@ getinfo_helper_events(control_connection_t *control_conn,
     /* Note that status/ is not a catch-all for events; there's only supposed
      * to be a status GETINFO if there's a corresponding STATUS event. */
     if (!strcmp(question, "status/circuit-established")) {
-      *answer = tor_strdup(can_complete_circuit ? "1" : "0");
+      *answer = tor_strdup(have_completed_a_circuit() ? "1" : "0");
     } else if (!strcmp(question, "status/enough-dir-info")) {
       *answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0");
     } else if (!strcmp(question, "status/good-server-descriptor") ||
diff --git a/src/or/main.c b/src/or/main.c
index 5a4e0a3..4571f68 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -150,7 +150,7 @@ static int called_loop_once = 0;
  * any longer (a big time jump happened, when we notice our directory is
  * heinously out-of-date, etc.
  */
-int can_complete_circuit=0;
+static int can_complete_circuits = 0;
 
 /** How often do we check for router descriptors that we should download
  * when we have too little directory info? */
@@ -171,11 +171,11 @@ int quiet_level = 0;
 /********* END VARIABLES ************/
 
 /****************************************************************************
-*
-* This section contains accessors and other methods on the connection_array
-* variables (which are global within this file and unavailable outside it).
-*
-****************************************************************************/
+ *
+ * This section contains accessors and other methods on the connection_array
+ * variables (which are global within this file and unavailable outside it).
+ *
+ ****************************************************************************/
 
 #if 0 && defined(USE_BUFFEREVENTS)
 static void
@@ -223,6 +223,32 @@ set_buffer_lengths_to_zero(tor_socket_t s)
 }
 #endif
 
+
+/** Return 1 if we have successfully built a circuit, and nothing has changed
+ * to make us think that maybe we can't.
+ */
+int
+have_completed_a_circuit(void)
+{
+  return can_complete_circuits;
+}
+
+/** Note that we have successfully built a circuit, so that reachability
+ * testing and introduction points and so on may be attempted. */
+void
+note_that_we_completed_a_circuit(void)
+{
+  can_complete_circuits = 1;
+}
+
+/** Note that something has happened (like a clock jump, or DisableNetwork) to
+ * make us think that maybe we can't complete circuits. */
+void
+note_that_we_maybe_cant_complete_circuits(void)
+{
+  can_complete_circuits = 0;
+}
+
 /** Add <b>conn</b> to the array of connections that we can poll on.  The
  * connection's socket must be set; the connection starts out
  * non-reading and non-writing.
@@ -999,7 +1025,7 @@ directory_info_has_arrived(time_t now, int from_cache)
   }
 
   if (server_mode(options) && !net_is_disabled() && !from_cache &&
-      (can_complete_circuit || !any_predicted_circuits(now)))
+      (have_completed_a_circuit() || !any_predicted_circuits(now)))
     consider_testing_reachability(1, 1);
 }
 
@@ -1436,7 +1462,7 @@ run_scheduled_events(time_t now)
     /* also, check religiously for reachability, if it's within the first
      * 20 minutes of our uptime. */
     if (is_server &&
-        (can_complete_circuit || !any_predicted_circuits(now)) &&
+        (have_completed_a_circuit() || !any_predicted_circuits(now)) &&
         !we_are_hibernating()) {
       if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) {
         consider_testing_reachability(1, dirport_reachability_count==0);
@@ -1549,7 +1575,7 @@ run_scheduled_events(time_t now)
   circuit_close_all_marked();
 
   /* 7. And upload service descriptors if necessary. */
-  if (can_complete_circuit && !net_is_disabled()) {
+  if (have_completed_a_circuit() && !net_is_disabled()) {
     rend_consider_services_upload(now);
     rend_consider_descriptor_republication();
   }
@@ -1680,7 +1706,7 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
   if (server_mode(options) &&
       !net_is_disabled() &&
       seconds_elapsed > 0 &&
-      can_complete_circuit &&
+      have_completed_a_circuit() &&
       stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT !=
       (stats_n_seconds_working+seconds_elapsed) /
         TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) {
diff --git a/src/or/main.h b/src/or/main.h
index e918517..7d98983 100644
--- a/src/or/main.h
+++ b/src/or/main.h
@@ -12,7 +12,9 @@
 #ifndef TOR_MAIN_H
 #define TOR_MAIN_H
 
-extern int can_complete_circuit;
+int have_completed_a_circuit(void);
+void note_that_we_completed_a_circuit(void);
+void note_that_we_maybe_cant_complete_circuits(void);
 
 int connection_add_impl(connection_t *conn, int is_connecting);
 #define connection_add(conn) connection_add_impl((conn), 0)
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 53abc82..e0e01ec 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -1562,7 +1562,7 @@ update_router_have_minimum_dir_info(void)
      * is back up and usable, and b) disable some activities that Tor
      * should only do while circuits are working, like reachability tests
      * and fetching bridge descriptors only over circuits. */
-    can_complete_circuit = 0;
+    note_that_we_maybe_cant_complete_circuits();
 
     control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO");
   }
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 353c671..ead9f3f 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -3075,7 +3075,7 @@ rend_services_introduce(void)
    * an intro point to. */
   smartlist_t *exclude_nodes = smartlist_new();
 
-  if (!can_complete_circuit)
+  if (!have_completed_a_circuit())
     return;
 
   now = time(NULL);



More information about the tor-commits mailing list