mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-28 14:23:30 +01:00
Add a function to schedule a periodic event once, then disable it
This commit is contained in:
parent
2070765c7c
commit
6d84972eb8
@ -1600,10 +1600,14 @@ rescan_periodic_events(const or_options_t *options)
|
||||
periodic_event_enable(item);
|
||||
} else {
|
||||
log_debug(LD_GENERAL, "Disabling periodic event %s", item->name);
|
||||
if (item->flags & PERIODIC_EVENT_FLAG_FLUSH_ON_DISABLE) {
|
||||
periodic_event_flush_and_disable(item);
|
||||
} else {
|
||||
periodic_event_disable(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* We just got new options globally set, see if we need to enabled or disable
|
||||
* periodic events. */
|
||||
|
@ -45,10 +45,6 @@ periodic_event_dispatch(mainloop_event_t *ev, void *data)
|
||||
periodic_event_item_t *event = data;
|
||||
tor_assert(ev == event->ev);
|
||||
|
||||
if (BUG(!periodic_event_is_enabled(event))) {
|
||||
return;
|
||||
}
|
||||
|
||||
time_t now = time(NULL);
|
||||
update_current_time(now);
|
||||
const or_options_t *options = get_options();
|
||||
@ -57,7 +53,7 @@ periodic_event_dispatch(mainloop_event_t *ev, void *data)
|
||||
int next_interval = 0;
|
||||
|
||||
if (!periodic_event_is_enabled(event)) {
|
||||
/* The event got disabled from inside its callback; no need to
|
||||
/* The event got disabled from inside its callback, or before: no need to
|
||||
* reschedule. */
|
||||
return;
|
||||
}
|
||||
@ -172,3 +168,19 @@ periodic_event_disable(periodic_event_item_t *event)
|
||||
mainloop_event_cancel(event->ev);
|
||||
event->enabled = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable an event, then schedule it to run once.
|
||||
* Do nothing if the event was already disabled.
|
||||
*/
|
||||
void
|
||||
periodic_event_flush_and_disable(periodic_event_item_t *event)
|
||||
{
|
||||
tor_assert(event);
|
||||
if (!periodic_event_is_enabled(event))
|
||||
return;
|
||||
|
||||
periodic_event_disable(event);
|
||||
|
||||
mainloop_event_activate(event->ev);
|
||||
}
|
||||
|
@ -39,6 +39,11 @@
|
||||
* the net_is_disabled() check. */
|
||||
#define PERIODIC_EVENT_FLAG_NEED_NET (1U << 0)
|
||||
|
||||
/* Indicate that it the event is enabled, it event needs to be run once before
|
||||
* it becomes disabled.
|
||||
*/
|
||||
#define PERIODIC_EVENT_FLAG_FLUSH_ON_DISABLE (1U << 1)
|
||||
|
||||
/** Callback function for a periodic event to take action. The return value
|
||||
* influences the next time the function will get called. Return
|
||||
* PERIODIC_EVENT_NO_UPDATE to not update <b>last_action_time</b> and be polled
|
||||
@ -83,6 +88,6 @@ void periodic_event_destroy(periodic_event_item_t *event);
|
||||
void periodic_event_reschedule(periodic_event_item_t *event);
|
||||
void periodic_event_enable(periodic_event_item_t *event);
|
||||
void periodic_event_disable(periodic_event_item_t *event);
|
||||
void periodic_event_flush_and_disable(periodic_event_item_t *event);
|
||||
|
||||
#endif /* !defined(TOR_PERIODIC_H) */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user