Author: Armin Rigo <[email protected]>
Branch: rewind_setjmp
Changeset: r1277:6659f9eaeeb5
Date: 2014-08-09 16:14 +0200
http://bitbucket.org/pypy/stmgc/changeset/6659f9eaeeb5/
Log: Import and adapt the test file
diff --git a/c7/test/test_rewind.c b/c7/test/test_rewind.c
new file mode 100644
--- /dev/null
+++ b/c7/test/test_rewind.c
@@ -0,0 +1,198 @@
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "rewind_setjmp.h"
+
+
+rewind_jmp_thread gthread;
+int gevents[1000];
+int num_gevents = 0;
+
+void gevent(int num)
+{
+ assert(num_gevents <= sizeof(gevents) / sizeof(int));
+ gevents[num_gevents++] = num;
+}
+
+void check_gevents(int expected[], int expected_size)
+{
+ int i;
+ int expected_count = expected_size / sizeof(int);
+ for (i = 0; i < expected_count && i < num_gevents; i++) {
+ assert(gevents[i] == expected[i]);
+ }
+ assert(num_gevents == expected_count);
+}
+
+#define CHECK(expected) check_gevents(expected, sizeof(expected))
+
+/************************************************************/
+
+__attribute__((noinline))
+void f1(int x)
+{
+ gevent(1);
+ if (x < 10) {
+ rewind_jmp_longjmp(>hread);
+ }
+}
+
+static int test1_x;
+
+void test1(void)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+
+ test1_x = 0;
+ rewind_jmp_setjmp(>hread);
+
+ test1_x++;
+ f1(test1_x);
+
+ assert(test1_x == 10);
+ int expected[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+ CHECK(expected);
+
+ rewind_jmp_leaveframe(>hread, &buf);
+}
+
+/************************************************************/
+
+static int test2_x;
+
+__attribute__((noinline))
+int f2(void)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+ test2_x = 0;
+ rewind_jmp_setjmp(>hread);
+ rewind_jmp_leaveframe(>hread, &buf);
+ return ++test2_x;
+}
+
+void test2(void)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+ int x = f2();
+ gevent(x);
+ if (x < 10)
+ rewind_jmp_longjmp(>hread);
+ rewind_jmp_leaveframe(>hread, &buf);
+ int expected[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ CHECK(expected);
+}
+
+/************************************************************/
+
+__attribute__((noinline))
+int f3(int rec)
+{
+ if (rec > 0)
+ return f3(rec - 1);
+ else
+ return f2();
+}
+
+void test3(void)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+ int x = f3(50);
+ gevent(x);
+ if (x < 10)
+ rewind_jmp_longjmp(>hread);
+ rewind_jmp_leaveframe(>hread, &buf);
+ int expected[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ CHECK(expected);
+}
+
+/************************************************************/
+
+__attribute__((noinline))
+int f4(int rec)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+ int res;
+ if (rec > 0)
+ res = f4(rec - 1);
+ else
+ res = f2();
+ rewind_jmp_leaveframe(>hread, &buf);
+ return res;
+}
+
+void test4(void)
+{
+ rewind_jmp_buf buf;
+ rewind_jmp_enterframe(>hread, &buf);
+ int x = f4(5);
+ gevent(x);
+ if (x < 10)
+ rewind_jmp_longjmp(>hread);
+ rewind_jmp_leaveframe(>hread, &buf);
+ int expected[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ CHECK(expected);
+}
+
+/************************************************************/
+
+void test5(void)
+{
+ struct { int a; rewind_jmp_buf buf; int b; } sbuf;
+ rewind_jmp_enterframe(>hread, &sbuf.buf);
+ sbuf.a = 42;
+ sbuf.b = -42;
+ test2_x = 0;
+ rewind_jmp_setjmp(>hread);
+ sbuf.a++;
+ sbuf.b--;
+ gevent(sbuf.a);
+ gevent(sbuf.b);
+ if (test2_x == 0) {
+ test2_x++;
+ rewind_jmp_longjmp(>hread);
+ }
+ int expected[] = {43, -43, 43, -43};
+ CHECK(expected);
+ rewind_jmp_leaveframe(>hread, &sbuf.buf);
+}
+
+/************************************************************/
+
+int rj_malloc_count = 0;
+
+void *rj_malloc(size_t size)
+{
+ rj_malloc_count++;
+ void *ptr = malloc(size);
+ fprintf(stderr, "malloc(%ld) -> %p\n", (long)size, ptr);
+ return ptr;
+}
+
+void rj_free(void *ptr)
+{
+ if (ptr)
+ rj_malloc_count--;
+ fprintf(stderr, "free(%p)\n", ptr);
+ free(ptr);
+}
+
+
+int main(int argc, char *argv[])
+{
+ assert(argc > 1);
+ if (!strcmp(argv[1], "1")) test1();
+ else if (!strcmp(argv[1], "2")) test2();
+ else if (!strcmp(argv[1], "3")) test3();
+ else if (!strcmp(argv[1], "4")) test4();
+ else if (!strcmp(argv[1], "5")) test5();
+ else
+ assert(!"bad argv[1]");
+ assert(rj_malloc_count == 0);
+ return 0;
+}
diff --git a/c7/test/test_rewind.py b/c7/test/test_rewind.py
new file mode 100644
--- /dev/null
+++ b/c7/test/test_rewind.py
@@ -0,0 +1,19 @@
+import os
+
+def run_test(opt):
+ err = os.system("clang -g -O%d -Werror -DRJBUF_CUSTOM_MALLOC -I../stm"
+ " -o test_rewind_O%d test_rewind.c ../stm/rewind_setjmp.c"
+ % (opt, opt))
+ if err != 0:
+ raise OSError("clang failed on test_rewind.c")
+ for testnum in [1, 2, 3, 4, 5]:
+ print '=== O%d: RUNNING TEST %d ===' % (opt, testnum)
+ err = os.system("./test_rewind_O%d %d" % (opt, testnum))
+ if err != 0:
+ raise OSError("'test_rewind_O%d %d' failed" % (opt, testnum))
+ os.unlink("./test_rewind_O%d" % (opt,))
+
+def test_O0(): run_test(0)
+def test_O1(): run_test(1)
+def test_O2(): run_test(2)
+def test_O3(): run_test(3)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit