Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit