implemented Setup.hs to build boehm cpp libs and install them;
[hs-boehmgc.git] / gc-7.2 / tests / thread_leak_test.c
diff --git a/gc-7.2/tests/thread_leak_test.c b/gc-7.2/tests/thread_leak_test.c
new file mode 100644 (file)
index 0000000..0710fc2
--- /dev/null
@@ -0,0 +1,86 @@
+
+#ifdef HAVE_CONFIG_H
+# include "private/config.h"
+#endif
+
+#ifndef GC_THREADS
+# define GC_THREADS
+#endif
+
+#include "leak_detector.h"
+
+#ifdef GC_PTHREADS
+# include <pthread.h>
+#else
+# include <windows.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef GC_PTHREADS
+  void * test(void * arg)
+#else
+  DWORD WINAPI test(LPVOID arg)
+#endif
+{
+    int *p[10];
+    int i;
+    for (i = 0; i < 10; ++i) {
+        p[i] = malloc(sizeof(int)+i);
+    }
+    CHECK_LEAKS();
+    for (i = 1; i < 10; ++i) {
+        free(p[i]);
+    }
+#   ifdef GC_PTHREADS
+      return arg;
+#   else
+      return (DWORD)(GC_word)arg;
+#   endif
+}
+
+#define NTHREADS 5
+
+int main(void) {
+    int i;
+#   ifdef GC_PTHREADS
+      pthread_t t[NTHREADS];
+#   else
+      HANDLE t[NTHREADS];
+      DWORD thread_id;
+#   endif
+    int code;
+
+    GC_set_find_leak(1); /* for new collect versions not compiled       */
+                         /* with -DFIND_LEAK.                           */
+    GC_INIT();
+
+    for (i = 0; i < NTHREADS; ++i) {
+#       ifdef GC_PTHREADS
+          code = pthread_create(t + i, 0, test, 0);
+#       else
+          t[i] = CreateThread(NULL, 0, test, 0, 0, &thread_id);
+          code = t[i] != NULL ? 0 : (int)GetLastError();
+#       endif
+        if (code != 0) {
+            printf("Thread creation failed %d\n", code);
+        }
+    }
+
+    for (i = 0; i < NTHREADS; ++i) {
+#       ifdef GC_PTHREADS
+          code = pthread_join(t[i], 0);
+#       else
+          code = WaitForSingleObject(t[i], INFINITE) == WAIT_OBJECT_0 ? 0 :
+                                                        (int)GetLastError();
+#       endif
+        if (code != 0) {
+            printf("Thread join failed %d\n", code);
+        }
+    }
+
+    CHECK_LEAKS();
+    CHECK_LEAKS();
+    CHECK_LEAKS();
+    return 0;
+}