~ chicken-core (chicken-5) 982090150a74fdfc344bb60903021063923a38bf
commit 982090150a74fdfc344bb60903021063923a38bf Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Jul 6 15:37:06 2025 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Jul 6 15:37:06 2025 +0200 use clock_gettime/QueryPerrformanceCounter for jiffies diff --git a/chicken.h b/chicken.h index 6ab9b8df..6bf400fc 100644 --- a/chicken.h +++ b/chicken.h @@ -2205,6 +2205,8 @@ C_fctexport C_word C_i_live_finalizer_count(void) C_regparm; C_fctexport C_word C_i_profilingp(void) C_regparm; C_fctexport C_word C_i_tty_forcedp(void) C_regparm; C_fctexport C_word C_i_setenv(C_word var, C_word val) C_regparm; +C_fctexport C_long C_current_jiffy(void) C_regparm; +C_fctexport C_long C_jiffies_per_second(void) C_regparm; C_fctexport C_word C_a_i_cpu_time(C_word **a, int c, C_word buf) C_regparm; C_fctexport C_word C_a_i_exact_to_inexact(C_word **a, int c, C_word n) C_regparm; diff --git a/r7lib.scm b/r7lib.scm index aac1c576..a34ea280 100644 --- a/r7lib.scm +++ b/r7lib.scm @@ -174,21 +174,21 @@ ) (module scheme.time (current-second - current-jiffy - jiffies-per-second) + current-jiffy + jiffies-per-second) (import (only chicken.base define-constant) (chicken foreign) - (only chicken.time current-seconds) - (only scheme + define inexact->exact)) + (only chicken.time current-seconds) + (only scheme + define inexact->exact)) ;; As of 2012-06-30. (define-constant tai-offset 35.) (define (current-second) (+ (current-seconds) tai-offset)) - (define current-jiffy (foreign-lambda integer "clock")) + (define current-jiffy (foreign-lambda long "C_current_jiffy")) - (define (jiffies-per-second) (foreign-value "CLOCKS_PER_SEC" integer)) + (define jiffies-per-second (foreign-lambda long "C_jiffies_per_second")) ) diff --git a/runtime.c b/runtime.c index d1d08ee8..00cd6677 100644 --- a/runtime.c +++ b/runtime.c @@ -13692,3 +13692,25 @@ C_char *C_getenventry(int i) return environ[ i ] == NULL ? NULL : C_strdup(environ[ i ]); #endif } + +C_long C_current_jiffy(void) { +#if defined(_WIN32) && !defined(__CYGWIN__) + LARGE_INTEGER ticks; + QueryPerformanceCounter(&ticks); + return ticks.QuadPart; +#else + struct timespec tm; + clock_gettime(CLOCK_MONOTONIC, &tm); + return tm.tv_nsec / 1000 + tm.tv_sec * 1000000; +#endif +} + +C_long C_jiffies_per_second(void) { +#if defined(_WIN32) && !defined(__CYGWIN__) + LARGE_INTEGER ticks; + QueryPerformanceFrequency(&ticks); + return ticks.QuadPart; +#else + return 1000000; +#endif +}Trap