|
@@ -982,19 +982,18 @@ conn_close_if_marked(int i)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- * them were reachable. Assume the network is down. Change state
|
|
|
- * so next time an application connection arrives we'll delay it
|
|
|
- * and try another directory fetch. Kill off all the circuit_wait
|
|
|
- * streams that are waiting now, since they will all timeout anyway.
|
|
|
+
|
|
|
+ * since otherwise it would complicate Tor's control-flow graph beyond all
|
|
|
+ * reason.
|
|
|
*/
|
|
|
-void
|
|
|
-directory_all_unreachable(time_t now)
|
|
|
+static void
|
|
|
+directory_all_unreachable_cb(evutil_socket_t fd, short event, void *arg)
|
|
|
{
|
|
|
- connection_t *conn;
|
|
|
- (void)now;
|
|
|
+ (void)fd;
|
|
|
+ (void)event;
|
|
|
+ (void)arg;
|
|
|
|
|
|
- stats_n_seconds_working=0;
|
|
|
+ connection_t *conn;
|
|
|
|
|
|
while ((conn = connection_get_by_type_state(CONN_TYPE_AP,
|
|
|
AP_CONN_STATE_CIRCUIT_WAIT))) {
|
|
@@ -1010,6 +1009,31 @@ directory_all_unreachable(time_t now)
|
|
|
control_event_general_status(LOG_ERR, "DIR_ALL_UNREACHABLE");
|
|
|
}
|
|
|
|
|
|
+static struct event *directory_all_unreachable_cb_event = NULL;
|
|
|
+
|
|
|
+
|
|
|
+ * them were reachable. Assume the network is down. Change state
|
|
|
+ * so next time an application connection arrives we'll delay it
|
|
|
+ * and try another directory fetch. Kill off all the circuit_wait
|
|
|
+ * streams that are waiting now, since they will all timeout anyway.
|
|
|
+ */
|
|
|
+void
|
|
|
+directory_all_unreachable(time_t now)
|
|
|
+{
|
|
|
+ (void)now;
|
|
|
+
|
|
|
+ stats_n_seconds_working=0;
|
|
|
+
|
|
|
+ if (!directory_all_unreachable_cb_event) {
|
|
|
+ directory_all_unreachable_cb_event =
|
|
|
+ tor_event_new(tor_libevent_get_base(),
|
|
|
+ -1, EV_READ, directory_all_unreachable_cb, NULL);
|
|
|
+ tor_assert(directory_all_unreachable_cb_event);
|
|
|
+ }
|
|
|
+
|
|
|
+ event_active(directory_all_unreachable_cb_event, EV_READ, 1);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
* network statuses or server descriptors. */
|
|
|
void
|