summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/conc059_c.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/concurrent/should_run/conc059_c.c')
-rw-r--r--testsuite/tests/concurrent/should_run/conc059_c.c44
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);
}