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.
This commit is contained in:
Mike Perry 2009-08-31 23:09:54 -07:00
parent 7ac9a66c8f
commit 95735e5478
4 changed files with 43 additions and 13 deletions

View File

@ -9,25 +9,39 @@
* \brief The actual details of building circuits.
**/
// XXX: Move this noise to common/compat.c?
#include <math.h>
#define CIRCUIT_PRIVATE
// 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);
double ln(double x);
double log(double x);
double pow(double x, double y);
double
ln(double x)
{
return log(x);
}
#undef log
#define CIRCUIT_PRIVATE
#include "or.h"
#include "crypto.h"
#define log _log
/********* START VARIABLES **********/
/** 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;
}
cbt->last_circ_at = approx_time();
cbt->circuit_build_times[cbt->build_times_idx] = time;
cbt->build_times_idx = (cbt->build_times_idx + 1) % NCIRCUITS_TO_OBSERVE;
if (cbt->total_build_times < NCIRCUITS_TO_OBSERVE)
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;
}
@ -471,8 +490,10 @@ circuit_build_times_check_too_many_timeouts(circuit_build_times_t *cbt)
get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
log_notice(LD_CIRC,
"Set circuit build timeout to %d based on %d recent circuit times",
get_options()->CircuitBuildTimeout, RECENT_CIRCUITS);
"Reset circuit build timeout to %d (Xm: %d a: %lf) based on "
"%d recent circuit times",
get_options()->CircuitBuildTimeout, cbt->Xm, cbt->alpha,
RECENT_CIRCUITS);
reset:
@ -532,8 +553,11 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
get_options()->CircuitBuildTimeout = lround(timeout/1000.0);
log_info(LD_CIRC,
"Set circuit build timeout to %d based on %d circuit times",
get_options()->CircuitBuildTimeout, cbt->total_build_times);
"Set circuit build timeout to %d (Xm: %d a: %lf) based on "
"%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,

View File

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

View File

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

View File

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