diff options
Diffstat (limited to 'testsuite/tests/concurrent/should_run/conc059_c.c')
-rw-r--r-- | testsuite/tests/concurrent/should_run/conc059_c.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/testsuite/tests/concurrent/should_run/conc059_c.c b/testsuite/tests/concurrent/should_run/conc059_c.c index f03615063f..98ac85ecf3 100644 --- a/testsuite/tests/concurrent/should_run/conc059_c.c +++ b/testsuite/tests/concurrent/should_run/conc059_c.c @@ -1,29 +1,53 @@ #include "HsFFI.h" #include "conc059_stub.h" +#include <stdbool.h> #include <unistd.h> #include <stdlib.h> +#include <errno.h> #include <stdio.h> #if mingw32_HOST_OS #include <windows.h> #endif +void millisleep(int milliseconds); + int main(int argc, char *argv[]) { hs_init(&argc,&argv); - f(500000); -#if mingw32_HOST_OS - Sleep(100); -#else - usleep(100000); -#endif + f(5000); // this should be considerably longer than the delay on the next + // line + millisleep(100); + printf("exiting...\n"); fflush(stdout); hs_exit(); printf("exited.\n"); -#if mingw32_HOST_OS - Sleep(1000); + millisleep(1000); + + exit(0); +} + +void millisleep(int milliseconds) { +#if defined(mingw32_HOST_OS) + Sleep(milliseconds); #else - usleep(1000000); + struct timespec ts = { + .tv_sec = milliseconds / 1000, + .tv_nsec = (milliseconds % 1000) * 1000000 + }; + + while (true) { + int ret = nanosleep(&ts, &ts); + if (ret == -1) { + if (errno != EINTR) { + printf("nanosleep failed\n"); + exit(1); + } else { + continue; + } + } else { + return; + } + } #endif - exit(0); } |