aboutsummaryrefslogtreecommitdiff
path: root/tinycc/tests/tests2/116_bound_setjmp2.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinycc/tests/tests2/116_bound_setjmp2.c')
-rw-r--r--tinycc/tests/tests2/116_bound_setjmp2.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/tinycc/tests/tests2/116_bound_setjmp2.c b/tinycc/tests/tests2/116_bound_setjmp2.c
new file mode 100644
index 0000000..151114d
--- /dev/null
+++ b/tinycc/tests/tests2/116_bound_setjmp2.c
@@ -0,0 +1,84 @@
+#include <stdio.h>
+#include <string.h>
+#include <setjmp.h>
+#if !defined(_WIN32)
+#include <pthread.h>
+#else
+#include <windows.h>
+#endif
+
+#define SIZE 10
+#define COUNT 10
+
+#define TST int i, a[2], b[2]; \
+ for (i = 0; i < 2; i++) a[i] = 0; \
+ for (i = 0; i < 2; i++) b[i] = 0
+
+static int count[SIZE];
+
+static void tst1 (jmp_buf loc)
+{
+ TST;
+ longjmp(loc, 1);
+}
+
+static void tst2(jmp_buf loc)
+{
+ jmp_buf jmp;
+
+ setjmp (jmp);
+ TST;
+ tst1(loc);
+}
+
+static void *tst (void * index)
+{
+ jmp_buf loc;
+ int i = *(int *) index;
+ static int v[SIZE];
+
+ for (v[i] = 0; v[i] < COUNT; v[i]++) {
+ if (setjmp (loc) == 0) {
+ TST;
+ tst2(loc);
+ }
+ else {
+ count[i]++;
+ }
+ i = *(int *) index;
+ }
+ return NULL;
+}
+
+int
+main (void)
+{
+ int i;
+#if !defined(_WIN32)
+ pthread_t id[SIZE];
+#else
+ HANDLE id[SIZE];
+#endif
+ int index[SIZE];
+
+ for (i = 0; i < SIZE; i++) {
+ index[i] = i;
+#if !defined(_WIN32)
+ pthread_create (&id[i], NULL, tst, (void *) &index[i]);
+#else
+ id[i] = CreateThread(NULL, 8192, (LPTHREAD_START_ROUTINE) tst, (void *) &index[i], 0, NULL);
+#endif
+ }
+ for (i = 0; i < SIZE; i++) {
+#if !defined(_WIN32)
+ pthread_join (id[i], NULL);
+#else
+ WaitForSingleObject(id[i], INFINITE);
+#endif
+ }
+ for (i = 0; i < SIZE; i++) {
+ if (count[i] != COUNT)
+ printf ("error: %d %d\n", i, count[i]);
+ }
+ return 0;
+}