aboutsummaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2015-11-02 10:49:33 -0500
committerNick Mathewson <nickm@torproject.org>2015-11-13 16:24:44 -0500
commite8b459a2fa93d8f2991e5cbf4512eb88525df544 (patch)
tree1b81f6f43d84d358ad6c8efa946b4306555bc7ea /src/or
parentfbeff307f7780b26c9645ec7dbd685807add6581 (diff)
downloadtor-e8b459a2fa93d8f2991e5cbf4512eb88525df544.tar.gz
tor-e8b459a2fa93d8f2991e5cbf4512eb88525df544.zip
Connect periodic events to main
Diffstat (limited to 'src/or')
-rw-r--r--src/or/main.c52
-rw-r--r--src/or/periodic.h1
2 files changed, 53 insertions, 0 deletions
diff --git a/src/or/main.c b/src/or/main.c
index 74ae91e86f..0db843f57d 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -44,6 +44,7 @@
#include "nodelist.h"
#include "ntmain.h"
#include "onion.h"
+#include "periodic.h"
#include "policies.h"
#include "transports.h"
#include "relay.h"
@@ -1227,6 +1228,13 @@ get_signewnym_epoch(void)
return newnym_epoch;
}
+/** DOCDOC */
+static int periodic_events_initialized = 0;
+
+static periodic_event_item_t periodic_events[] = {
+ END_OF_PERIODIC_EVENTS
+};
+
typedef struct {
time_t last_rotated_x509_certificate;
time_t check_v3_certificate;
@@ -1267,7 +1275,46 @@ static time_to_t time_to = {
void
reset_all_main_loop_timers(void)
{
+ int i;
memset(&time_to, 0, sizeof(time_to));
+ for (i = 0; periodic_events[i].name; ++i) {
+ periodic_event_reschedule(&periodic_events[i]);
+ }
+}
+
+/** DOCDOC */
+static void
+initialize_periodic_events_cb(evutil_socket_t fd, short events, void *data)
+{
+ (void) fd;
+ (void) events;
+ (void) data;
+ int i;
+ for (i = 0; periodic_events[i].name; ++i) {
+ periodic_event_launch(&periodic_events[i]);
+ }
+}
+
+/** DOCDOC */
+static void
+initialize_periodic_events(void)
+{
+ tor_assert(periodic_events_initialized == 0);
+ periodic_events_initialized = 1;
+
+ struct timeval one_second = { 1, 0 };
+ event_base_once(tor_libevent_get_base(), -1, 0,
+ initialize_periodic_events_cb, NULL,
+ &one_second);
+}
+
+static void
+teardown_periodic_events(void)
+{
+ int i;
+ for (i = 0; periodic_events[i].name; ++i) {
+ periodic_event_destroy(&periodic_events[i]);
+ }
}
/**
@@ -2144,6 +2191,10 @@ do_main_loop(void)
tor_assert(second_timer);
}
+ if (! periodic_events_initialized) {
+ initialize_periodic_events();
+ }
+
#ifdef HAVE_SYSTEMD_209
uint64_t watchdog_delay;
/* set up systemd watchdog notification. */
@@ -2852,6 +2903,7 @@ tor_free_all(int postfork)
smartlist_free(closeable_connection_lst);
smartlist_free(active_linked_connection_lst);
periodic_timer_free(second_timer);
+ teardown_periodic_events();
#ifndef USE_BUFFEREVENTS
periodic_timer_free(refill_timer);
#endif
diff --git a/src/or/periodic.h b/src/or/periodic.h
index 7d5b1b47bf..3a73f64f40 100644
--- a/src/or/periodic.h
+++ b/src/or/periodic.h
@@ -25,6 +25,7 @@ typedef struct periodic_event_item_t {
/** events will get their interval from first execution */
#define PERIODIC_EVENT(fn) { fn##_callback, 0, 0, NULL, #fn }
+#define END_OF_PERIODIC_EVENTS { NULL, 0, 0, NULL, NULL }
#if 0
/** Refactor test, check the last_action_time was now or (now - delta - 1)