diff --git a/changes/ticket26063 b/changes/ticket26063 new file mode 100644 index 000000000..c11eb2d15 --- /dev/null +++ b/changes/ticket26063 @@ -0,0 +1,5 @@ + o Major features (CPU usage, mobile): + - When Tor is disabled (via DisableNetwork or via hibernation), it + no longer needs to run any per-second events. This change should + make it easier for mobile applications to disable Tor while the + device is sleeping, or Tor is not running. Closes ticket 26063. diff --git a/src/or/config.c b/src/or/config.c index e695947f0..2cc28b6d7 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -2001,6 +2001,9 @@ options_act(const or_options_t *old_options) finish_daemon(options->DataDirectory); } + /* See whether we need to enable/disable our once-a-second timer. */ + reschedule_per_second_timer(); + /* We want to reinit keys as needed before we do much of anything else: keys are important, and other things can depend on them. */ if (transition_affects_workers || diff --git a/src/or/control.c b/src/or/control.c index 44439b6d5..237a8572d 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -277,6 +277,7 @@ control_update_global_event_mask(void) smartlist_t *conns = get_connection_array(); event_mask_t old_mask, new_mask; old_mask = global_event_mask; + int any_old_per_sec_events = control_any_per_second_event_enabled(); global_event_mask = 0; SMARTLIST_FOREACH(conns, connection_t *, _conn, @@ -316,6 +317,10 @@ control_update_global_event_mask(void) uint64_t r, w; control_get_bytes_rw_last_sec(&r, &w); } + if (any_old_per_sec_events != control_any_per_second_event_enabled()) { + reschedule_per_second_timer(); + } + #undef NEWLY_ENABLED } diff --git a/src/or/hibernate.c b/src/or/hibernate.c index f73b0420d..24479cff9 100644 --- a/src/or/hibernate.c +++ b/src/or/hibernate.c @@ -1137,6 +1137,8 @@ on_hibernate_state_change(hibernate_state_t prev_state) if (prev_state != HIBERNATE_STATE_INITIAL) { rescan_periodic_events(get_options()); } + + reschedule_per_second_timer(); } #ifdef TOR_UNIT_TESTS