Browse Source

Fix the math.h log() conflict.

It was compiling, but causing segfaults.

Also, adjust when the timer starts for new test circs
and save state every 25 circuits.
Mike Perry 15 years ago
parent
commit
95735e5478
4 changed files with 43 additions and 13 deletions
  1. 37 13
      src/or/circuitbuild.c
  2. 2 0
      src/or/circuitlist.c
  3. 1 0
      src/or/circuituse.c
  4. 3 0
      src/or/or.h

+ 37 - 13
src/or/circuitbuild.c

@@ -9,25 +9,39 @@
  * \brief The actual details of building circuits.
  * \brief The actual details of building circuits.
  **/
  **/
 
 
-// XXX: Move this noise to common/compat.c?
+#define CIRCUIT_PRIVATE
-#include <math.h>
 
 
-// also use pow()
+#include "or.h"
+#include "crypto.h"
 
 
+/*
+ * This madness is needed because if we simply #undef log
+ * before including or.h or log.h, we get linker collisions
+ * and random segfaults due to memory corruption (and
+ * not even at calls to log() either!)
+ */
+#undef log
+
+/*
+ * Linux doesn't provide lround in math.h by default,
+ * but mac os does... Its best just to leave math.h
+ * out of the picture entirely.
+ */
+//#define log math_h_log
+//#include <math.h>
+//#undef log
 long int lround(double x);
 long int lround(double x);
 double ln(double x);
 double ln(double x);
+double log(double x);
+double pow(double x, double y);
 
 
 double
 double
 ln(double x)
 ln(double x)
 {
 {
   return log(x);
   return log(x);
 }
 }
-#undef log
 
 
-#define CIRCUIT_PRIVATE
+#define log _log
-
-#include "or.h"
-#include "crypto.h"
 
 
 /********* START VARIABLES **********/
 /********* START VARIABLES **********/
 /** Global list of circuit build times */
 /** Global list of circuit build times */
@@ -98,12 +112,17 @@ circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time)
     return -1;
     return -1;
   }
   }
 
 
-  cbt->last_circ_at = approx_time();
   cbt->circuit_build_times[cbt->build_times_idx] = time;
   cbt->circuit_build_times[cbt->build_times_idx] = time;
   cbt->build_times_idx = (cbt->build_times_idx + 1) % NCIRCUITS_TO_OBSERVE;
   cbt->build_times_idx = (cbt->build_times_idx + 1) % NCIRCUITS_TO_OBSERVE;
   if (cbt->total_build_times < NCIRCUITS_TO_OBSERVE)
   if (cbt->total_build_times < NCIRCUITS_TO_OBSERVE)
     cbt->total_build_times++;
     cbt->total_build_times++;
 
 
+  if ((cbt->total_build_times % BUILD_TIMES_SAVE_STATE_EVERY) == 0) {
+    /* Save state every 100 circuit builds */
+    if (!get_options()->AvoidDiskWrites)
+      or_state_mark_dirty(get_or_state(), 0);
+  }
+
   return 0;
   return 0;
 }
 }
 
 
@@ -471,8 +490,10 @@ circuit_build_times_check_too_many_timeouts(circuit_build_times_t *cbt)
   get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
   get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
 
 
   log_notice(LD_CIRC,
   log_notice(LD_CIRC,
-           "Set circuit build timeout to %d based on %d recent circuit times",
+           "Reset circuit build timeout to %d (Xm: %d a: %lf) based on "
-           get_options()->CircuitBuildTimeout, RECENT_CIRCUITS);
+           "%d recent circuit times",
+           get_options()->CircuitBuildTimeout, cbt->Xm, cbt->alpha,
+           RECENT_CIRCUITS);
 
 
 reset:
 reset:
 
 
@@ -532,8 +553,11 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
   get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
   get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
 
 
   log_info(LD_CIRC,
   log_info(LD_CIRC,
-           "Set circuit build timeout to %d based on %d circuit times",
+          "Set circuit build timeout to %d (Xm: %d a: %lf) based on "
-           get_options()->CircuitBuildTimeout, cbt->total_build_times);
+           "%d circuit times",
+           get_options()->CircuitBuildTimeout, cbt->Xm, cbt->alpha,
+           cbt->total_build_times);
+
 }
 }
 
 
 /** Iterate over values of circ_id, starting from conn-\>next_circ_id,
 /** Iterate over values of circ_id, starting from conn-\>next_circ_id,

+ 2 - 0
src/or/circuitlist.c

@@ -408,6 +408,8 @@ origin_circuit_new(void)
 
 
   init_circuit_base(TO_CIRCUIT(circ));
   init_circuit_base(TO_CIRCUIT(circ));
 
 
+  circ_times.last_circ_at = approx_time();
+
   return circ;
   return circ;
 }
 }
 
 

+ 1 - 0
src/or/circuituse.c

@@ -527,6 +527,7 @@ circuit_predict_and_launch_new(void)
     log_info(LD_CIRC,
     log_info(LD_CIRC,
              "Have %d clean circs need another buildtime test circ.", num);
              "Have %d clean circs need another buildtime test circ.", num);
     circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
     circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
+    return;
   }
   }
 }
 }
 
 

+ 3 - 0
src/or/or.h

@@ -2877,6 +2877,9 @@ typedef uint32_t build_time_t;
 /* How often in seconds should we build a test circuit */
 /* How often in seconds should we build a test circuit */
 #define BUILD_TIMES_TEST_FREQUENCY 60
 #define BUILD_TIMES_TEST_FREQUENCY 60
 
 
+/* Save state every 25 circuits */
+#define BUILD_TIMES_SAVE_STATE_EVERY  25
+
 typedef struct {
 typedef struct {
   build_time_t circuit_build_times[NCIRCUITS_TO_OBSERVE];
   build_time_t circuit_build_times[NCIRCUITS_TO_OBSERVE];
   time_t network_last_live;
   time_t network_last_live;