mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
config: Set up periodic events when options changes
In case we transitionned to a new role in Tor, we need to launch and/or destroy some periodic events. Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
a4fcdc5dec
commit
1d864987cb
@ -903,8 +903,13 @@ set_options(or_options_t *new_val, char **msg)
|
|||||||
smartlist_free(elements);
|
smartlist_free(elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old_options != global_options)
|
if (old_options != global_options) {
|
||||||
or_options_free(old_options);
|
or_options_free(old_options);
|
||||||
|
/* If we are here it means we've successfully applied the new options and
|
||||||
|
* that the global options have been changed to the new values. We'll
|
||||||
|
* check if we need to remove or add periodic events. */
|
||||||
|
periodic_events_on_new_options(global_options);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1530,6 +1530,47 @@ teardown_periodic_events(void)
|
|||||||
periodic_events_initialized = 0;
|
periodic_events_initialized = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Do a pass at all our periodic events, destroy those we don't need anymore
|
||||||
|
* and enabled those we need now using the given options. */
|
||||||
|
static void
|
||||||
|
rescan_periodic_events(const or_options_t *options)
|
||||||
|
{
|
||||||
|
tor_assert(options);
|
||||||
|
|
||||||
|
int roles = get_my_roles(options);
|
||||||
|
|
||||||
|
for (int i = 0; periodic_events[i].name; ++i) {
|
||||||
|
periodic_event_item_t *item = &periodic_events[i];
|
||||||
|
int is_enabled = periodic_event_is_enabled(item);
|
||||||
|
int need_item = (item->roles & roles);
|
||||||
|
|
||||||
|
/* We need this event but it is *not* enabled. */
|
||||||
|
if (need_item && !is_enabled) {
|
||||||
|
periodic_event_launch(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* We do *not* need this event but it is enabled. */
|
||||||
|
if (!need_item && is_enabled) {
|
||||||
|
periodic_event_destroy(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We just got new options globally set, see if we need to destroy or setup
|
||||||
|
* periodic events. */
|
||||||
|
void
|
||||||
|
periodic_events_on_new_options(const or_options_t *options)
|
||||||
|
{
|
||||||
|
/* Only if we've already initialized once the events, teardown them all and
|
||||||
|
* reinitialize. It is just simpler that way instead of going through all
|
||||||
|
* currently enabled events and trying to destroy only the one that could be
|
||||||
|
* affected. */
|
||||||
|
if (periodic_events_initialized) {
|
||||||
|
rescan_periodic_events(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update our schedule so that we'll check whether we need to update our
|
* Update our schedule so that we'll check whether we need to update our
|
||||||
* descriptor immediately, rather than after up to CHECK_DESCRIPTOR_INTERVAL
|
* descriptor immediately, rather than after up to CHECK_DESCRIPTOR_INTERVAL
|
||||||
|
@ -86,6 +86,8 @@ uint64_t get_main_loop_success_count(void);
|
|||||||
uint64_t get_main_loop_error_count(void);
|
uint64_t get_main_loop_error_count(void);
|
||||||
uint64_t get_main_loop_idle_count(void);
|
uint64_t get_main_loop_idle_count(void);
|
||||||
|
|
||||||
|
void periodic_events_on_new_options(const or_options_t *options);
|
||||||
|
|
||||||
extern time_t time_of_process_start;
|
extern time_t time_of_process_start;
|
||||||
extern int quiet_level;
|
extern int quiet_level;
|
||||||
extern token_bucket_rw_t global_bucket;
|
extern token_bucket_rw_t global_bucket;
|
||||||
|
Loading…
Reference in New Issue
Block a user