From bd12af5f2c3104e03c9e04658187bdb32c4bd4cf Mon Sep 17 00:00:00 2001 From: Jörg F. Wittenberger Date: Sat, 13 Jun 2015 08:39:40 +0200 Subject: [PATCH] Use new typedef `C_time_t` instead of `double` for internal time. New, optional preprocessor constant C_INTERNAL_TIME_TYPE defaulting to double. Note: Support for a first alternative `long` may not yet work. --- chicken.h | 14 ++++++++++++-- runtime.c | 26 ++++++++++++-------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/chicken.h b/chicken.h index dd78898..2545318 100644 --- a/chicken.h +++ b/chicken.h @@ -775,6 +775,15 @@ typedef struct C_ptable_entry_struct void *ptr; } C_PTABLE_ENTRY; +#if !defined(C_INTERNAL_TIME_TYPE) || (C_INTERNAL_TIME_TYPE == 1) +typedef double C_time_t; +#define C_floor_time(x) C_floor(x) +#elif (C_INTERNAL_TIME_TYPE == 2) +typedef long C_time_t; +#define C_floor_time(x) x +#else #error "C_INTERNAL_TIME_TYPE must {1,2} for 'double' or 'long'" +#endif + #ifdef __x86_64__ # define C_AMD64_ABI_WEIRDNESS , ... #else @@ -1986,8 +1996,8 @@ C_fctexport C_word C_fcall C_a_i_flonum_round_proper(C_word **a, int c, C_word n C_fctexport C_word C_fcall C_i_getprop(C_word sym, C_word prop, C_word def) C_regparm; C_fctexport C_word C_fcall C_putprop(C_word **a, C_word sym, C_word prop, C_word val) C_regparm; C_fctexport C_word C_fcall C_i_get_keyword(C_word key, C_word args, C_word def) C_regparm; -C_fctexport double C_fcall C_milliseconds(void) C_regparm; -C_fctexport double C_fcall C_cpu_milliseconds(void) C_regparm; +C_fctexport C_time_t C_fcall C_milliseconds(void) C_regparm; +C_fctexport C_time_t C_fcall C_cpu_milliseconds(void) C_regparm; C_fctexport C_word C_fcall C_a_i_cpu_time(C_word **a, int c, C_word buf) C_regparm; C_fctexport C_word C_fcall C_a_i_string_to_number(C_word **a, int c, C_word str, C_word radix) C_regparm; C_fctexport C_word C_fcall C_a_i_exact_to_inexact(C_word **a, int c, C_word n) C_regparm; diff --git a/runtime.c b/runtime.c index 8267954..ff880fa 100644 --- a/runtime.c +++ b/runtime.c @@ -449,7 +449,7 @@ static C_TLS sigjmp_buf gc_restart; #else static C_TLS jmp_buf gc_restart; #endif -static C_TLS double +static C_TLS C_time_t timer_start_ms, gc_ms, timer_accumulated_gc_ms, @@ -1790,17 +1790,16 @@ C_word C_dbg_hook(C_word dummy) /* Timing routines: */ -C_regparm double C_fcall C_milliseconds(void) +C_regparm C_time_t C_fcall C_milliseconds(void) { #ifdef C_NONUNIX if(CLOCKS_PER_SEC == 1000) return clock(); - else return C_floor(((double)clock() / (double)CLOCKS_PER_SEC) * 1000); + else return C_floor_time(((double)clock() / (double)CLOCKS_PER_SEC) * 1000); #else struct timeval tv; if(C_gettimeofday(&tv, NULL) == -1) return 0; - else return - C_floor(((double)tv.tv_sec - C_startup_time_seconds) * 1000.0 + tv.tv_usec / 1000); + else return C_floor_time((tv.tv_sec - C_startup_time_seconds) * (C_time_t)1000 + tv.tv_usec / 1000); #endif } @@ -1828,18 +1827,17 @@ C_regparm time_t C_fcall C_seconds(C_long *ms) } -C_regparm double C_fcall C_cpu_milliseconds(void) +C_regparm C_time_t C_fcall C_cpu_milliseconds(void) { #if defined(C_NONUNIX) || defined(__CYGWIN__) if(CLOCKS_PER_SEC == 1000) return clock(); - else return C_floor(((double)clock() / (double)CLOCKS_PER_SEC) * 1000); + else return C_floor_time(((double)clock() / (double)CLOCKS_PER_SEC) * 1000); #else struct rusage ru; if(C_getrusage(RUSAGE_SELF, &ru) == -1) return 0; - else return - C_floor(((double)ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) * 1000 - + ((double)ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000); + else return C_floor_time(((double)ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) * 1000 + + ((double)ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000); #endif } @@ -2742,7 +2740,7 @@ C_regparm void C_fcall C_reclaim(void *trampoline, void *proc) C_SCHEME_BLOCK *bp; C_GC_ROOT *gcrp; WEAK_TABLE_ENTRY *wep; - double tgc = 0; + C_time_t tgc = 0; C_SYMBOL_TABLE *stp; volatile int finalizers_checked; FINALIZER_NODE *flist; @@ -3633,7 +3631,7 @@ C_regparm WEAK_TABLE_ENTRY *C_fcall lookup_weak_table_entry(C_word item, C_word void handle_interrupt(void *trampoline, void *proc) { C_word *p, x, n; - double c; + C_time_t c; /* Build vector with context information: */ n = C_temporary_stack_bottom - C_temporary_stack; @@ -4020,7 +4018,7 @@ C_regparm C_word C_fcall C_start_timer(void) void C_ccall C_stop_timer(C_word c, C_word closure, C_word k) { - double t0 = C_cpu_milliseconds() - timer_start_ms; + C_time_t t0 = C_cpu_milliseconds() - timer_start_ms; C_word ab[ WORDS_PER_FLONUM * 2 + 7 ], /* 2 flonums, 1 vector of 6 elements */ *a = ab, @@ -4165,7 +4163,7 @@ C_regparm C_word C_fcall C_char_ready_p(C_word port) C_regparm C_word C_fcall C_fudge(C_word fudge_factor) { int i, j; - double tgc; + C_time_t tgc; switch(fudge_factor) { case C_fix(1): return C_SCHEME_END_OF_FILE; /* eof object */ -- 2.1.4