diff options
-rw-r--r-- | testsuite/tests/concurrent/should_run/conc059.hs | 17 | ||||
-rw-r--r-- | testsuite/tests/concurrent/should_run/conc059.stdout | 2 | ||||
-rw-r--r-- | testsuite/tests/concurrent/should_run/conc059_c.c | 44 |
3 files changed, 37 insertions, 26 deletions
diff --git a/testsuite/tests/concurrent/should_run/conc059.hs b/testsuite/tests/concurrent/should_run/conc059.hs index 86e202c9a2..823d8b7a03 100644 --- a/testsuite/tests/concurrent/should_run/conc059.hs +++ b/testsuite/tests/concurrent/should_run/conc059.hs @@ -13,22 +13,9 @@ import Foreign.C f :: Int -> IO () f x = do print x - replicateM_ 10 $ forkIO $ do usleep (fromIntegral x); putStrLn "hello" + replicateM_ 10 $ forkIO $ do millisleep (fromIntegral x); putStrLn "hello" return () foreign export ccall "f" f :: Int -> IO () -#if defined(mingw32_HOST_OS) -# if defined(i386_HOST_ARCH) -# define WINDOWS_CCONV stdcall -# elif defined(x86_64_HOST_ARCH) -# define WINDOWS_CCONV ccall -# else -# error Unknown mingw32 arch -# endif - -foreign import WINDOWS_CCONV safe "Sleep" _sleep :: Int -> IO () -usleep n = _sleep (n `quot` 1000) -#else -foreign import ccall safe "usleep" usleep :: Int -> IO () -#endif +foreign import ccall safe "millisleep" millisleep :: CInt -> IO () diff --git a/testsuite/tests/concurrent/should_run/conc059.stdout b/testsuite/tests/concurrent/should_run/conc059.stdout index 961a9d1f26..5c6172b85b 100644 --- a/testsuite/tests/concurrent/should_run/conc059.stdout +++ b/testsuite/tests/concurrent/should_run/conc059.stdout @@ -1,3 +1,3 @@ exiting... -500000 +5000 exited. 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); } |