From 336c856e52d211aad6b40d29986264f3277a1327 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 20 Nov 2014 12:03:46 -0500 Subject: [PATCH] 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(-) create mode 100644 changes/no_global_ccc diff --git a/changes/no_global_ccc b/changes/no_global_ccc new file mode 100644 index 0000000000..614055a845 --- /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 42c4870e87..34934dc519 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 5b62c565b9..e08c09d54d 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 54464cc23b..72c62277f6 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 5a4e0a3e2d..4571f682ff 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 conn 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 e918517b82..7d98983100 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 53abc820f5..e0e01ec190 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 353c671550..ead9f3fe66 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);