From fa68b036b25f7a5a30833de924b7a27e149699eb Mon Sep 17 00:00:00 2001 From: Henrik Gramner Date: Wed, 15 Jun 2022 16:55:42 +0200 Subject: checkasm: Improve seed generation on Windows GetTickCount() increases at a very low frequency, >10ms per tick. When running multiple loops of checkasm instances in parallel different instances regularly ends up using identical seeds. Prefer the use of QueryPerformanceCounter() instead, which ticks at a significantly higher rate, which in turn increases randomness. --- tests/checkasm/checkasm.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'tests') diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index e0aebaf..787ecbf 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -38,10 +38,6 @@ #define COLOR_RED FOREGROUND_RED #define COLOR_GREEN FOREGROUND_GREEN #define COLOR_YELLOW (FOREGROUND_RED|FOREGROUND_GREEN) - -static unsigned get_seed(void) { - return GetTickCount(); -} #else #include #include @@ -52,16 +48,6 @@ static unsigned get_seed(void) { #define COLOR_RED 1 #define COLOR_GREEN 2 #define COLOR_YELLOW 3 - -static unsigned get_seed(void) { -#ifdef __APPLE__ - return (unsigned) mach_absolute_time(); -#elif defined(HAVE_CLOCK_GETTIME) - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return (unsigned) (1000000000ULL * ts.tv_sec + ts.tv_nsec); -#endif -} #endif /* List of tests to invoke */ @@ -521,6 +507,20 @@ static void print_cpu_name(void) { } } +static unsigned get_seed(void) { +#ifdef _WIN32 + LARGE_INTEGER i; + QueryPerformanceCounter(&i); + return i.LowPart; +#elif defined(__APPLE__) + return (unsigned) mach_absolute_time(); +#else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (unsigned) (1000000000ULL * ts.tv_sec + ts.tv_nsec); +#endif +} + int main(int argc, char *argv[]) { state.seed = get_seed(); -- cgit v1.2.3