Commit 78629c24 authored by Ben Gamari's avatar Ben Gamari 🐢 Committed by Marge Bot

testsuite: Increase delay in conc059

As noted in #19179, conc059 can sometimes fail due to too short of a
delay in the its Haskell threads. Address this by increasing the delay
by an order of magnitude to 5 seconds.

While I'm in town I refactored the test to eliminate a great deal of
unnecessary platform dependence, eliminate use of the deprecated
usleep, and properly handle interruption by signals.

Fixes #19179.
parent 27544196
Pipeline #29712 canceled with stages
......@@ -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 ()
#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);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment