]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Connect periodic events to main
authorNick Mathewson <nickm@torproject.org>
Mon, 2 Nov 2015 15:49:33 +0000 (10:49 -0500)
committerNick Mathewson <nickm@torproject.org>
Fri, 13 Nov 2015 21:24:44 +0000 (16:24 -0500)
src/or/main.c
src/or/periodic.h

index 74ae91e86f8ab517daf63202a02c1ed9a10d26ab..0db843f57d4a251c3c26379193830f6e4f456be1 100644 (file)
@@ -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
index 7d5b1b47bf984f85987e9b37f9651d656adca84d..3a73f64f40203a1186af2200d6c8e9c8b1a74d2f 100644 (file)
@@ -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)