summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--testsuite/tests/rts/T8124.hs6
-rw-r--r--testsuite/tests/rts/T8124_c.c42
2 files changed, 48 insertions, 0 deletions
diff --git a/testsuite/tests/rts/T8124.hs b/testsuite/tests/rts/T8124.hs
new file mode 100644
index 0000000000..c914b03ec5
--- /dev/null
+++ b/testsuite/tests/rts/T8124.hs
@@ -0,0 +1,6 @@
+module T8124 where
+
+f :: Int -> Int
+f x = x + 1
+
+foreign export ccall "f" f :: Int -> Int
diff --git a/testsuite/tests/rts/T8124_c.c b/testsuite/tests/rts/T8124_c.c
new file mode 100644
index 0000000000..e7e8739ae1
--- /dev/null
+++ b/testsuite/tests/rts/T8124_c.c
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+#include "T8124_stub.h"
+#include "HsFFI.h"
+#include <pthread.h>
+
+void *thread(void *param)
+{
+ f(3);
+ hs_thread_done();
+ pthread_exit(NULL);
+}
+
+int main (int argc, char *argv[])
+{
+ hs_init(&argc,&argv);
+
+ // check that we can call hs_thread_done() without having made any
+ // Haskell calls:
+ hs_thread_done();
+
+ // check that we can call hs_thread_done() and then make another Haskell
+ // call:
+ int i;
+ for (i=0; i < 1000; i++) {
+ f(3);
+ hs_thread_done();
+ }
+
+ // check that we can call hs_thread_done() twice:
+ hs_thread_done();
+ hs_thread_done();
+
+ // check that hs_thread_done() from child threads works:
+ pthread_t pid;
+ for (i=0; i < 1000; i++) {
+ pthread_create(&pid, NULL, thread, NULL);
+ pthread_join(pid, NULL);
+ }
+
+ hs_exit();
+ exit(0);
+}