diff options
| -rw-r--r-- | testsuite/tests/rts/T8124.hs | 6 | ||||
| -rw-r--r-- | testsuite/tests/rts/T8124_c.c | 42 |
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); +} |
