diff options
Diffstat (limited to 'tests/threads/regression')
| -rw-r--r-- | tests/threads/regression/ffi_o3.zc | 16 | ||||
| -rw-r--r-- | tests/threads/regression/recycle.zc | 11 | ||||
| -rw-r--r-- | tests/threads/regression/resources.zc | 15 | ||||
| -rw-r--r-- | tests/threads/regression/resources_counts.zc | 13 |
4 files changed, 55 insertions, 0 deletions
diff --git a/tests/threads/regression/ffi_o3.zc b/tests/threads/regression/ffi_o3.zc new file mode 100644 index 0000000..ecf8c0c --- /dev/null +++ b/tests/threads/regression/ffi_o3.zc @@ -0,0 +1,16 @@ +namespace; +include rt; +extern void qsort(word* base, long length, long size, void* compare); +int calls; +int compare(int* a, int* b) { calls++; return *a - *b; } +o3 int sum(int n) { int total = 0; for (int i = 0; i <= n; i++) total += i; return total; } +unchecked fn main() { + word comparator = cfunc(compare); int fd = 0; + let context = rt.syscall(51, fn() { + int values[3]; values[0] = 3; values[1] = 1; values[2] = 2; qsort(values, 3, 8, comparator); + int result[3]; result[0] = values[0] == 1 && values[2] == 3 && calls > 0; result[1] = sum(100); result[2] = calls; + rt.syscall(44, fd, result, 3); return 0; + } as word, &fd, 0); + int result[3]; rt.syscall(45, fd, result, 3); rt.syscall(52, context, 0, 0); + rt.put_n(result[0]); rt.put_c(' '); rt.put_n(result[1]); rt.put_c(' '); rt.put_n(calls); rt.put_c(10); return 0; +} diff --git a/tests/threads/regression/recycle.zc b/tests/threads/regression/recycle.zc new file mode 100644 index 0000000..4f0454a --- /dev/null +++ b/tests/threads/regression/recycle.zc @@ -0,0 +1,11 @@ +namespace; +include rt; +unchecked fn main() { + int i = 0, total = 0; + while (i < 12) { + int fd = 0; + let context = rt.syscall(51, fn() { int value = i; rt.syscall(44, fd, &value, 1); return 0; } as word, &fd, 0); + int result = 0; rt.syscall(45, fd, &result, 1); total += result; rt.syscall(52, context, 0, 0); i++; + } + rt.put_n(total); rt.put_c(10); return 0; +} diff --git a/tests/threads/regression/resources.zc b/tests/threads/regression/resources.zc new file mode 100644 index 0000000..abc0229 --- /dev/null +++ b/tests/threads/regression/resources.zc @@ -0,0 +1,15 @@ +namespace; +include rt; +extern int fcntl(int fd, int command); +int descriptors() { int count = 0; for (int fd = 0; fd < 256; fd++) if (fcntl(fd, 1) >= 0) count++; return count; } +unchecked fn main() { + int before = descriptors(), i = 0, closed = 0; + while (i < 24) { + int fd = 0; + let context = rt.syscall(51, fn() { int value = 1; rt.syscall(44, fd, &value, 1); return 0; } as word, &fd, 0); + int result; rt.syscall(45, fd, &result, 1); rt.syscall(52, context, 0, 0); + closed += rt.syscall(44, fd, &result, 1) == -1; i++; + } + rt.put_n(descriptors() == before); rt.put_c(' '); rt.put_n(closed); rt.put_c(' '); + rt.put_n(rt.syscall(55, 0, 0, 0)); rt.put_c(' '); rt.put_n(rt.syscall(55, 1, 0, 0)); rt.put_c(' '); rt.put_n(rt.syscall(55, 2, 0, 0)); rt.put_c(10); return 0; +} diff --git a/tests/threads/regression/resources_counts.zc b/tests/threads/regression/resources_counts.zc new file mode 100644 index 0000000..66cfc91 --- /dev/null +++ b/tests/threads/regression/resources_counts.zc @@ -0,0 +1,13 @@ +namespace; +include rt; +unchecked fn main() { + int closed = 0; + for (int i = 0; i < 24; i++) { + int fd = 0; + let context = rt.syscall(51, fn() { int value = 1; rt.syscall(44, fd, &value, 1); return 0; } as word, &fd, 0); + int result; rt.syscall(45, fd, &result, 1); rt.syscall(52, context, 0, 0); + closed += rt.syscall(44, fd, &result, 1) == -1; + } + rt.put_n(closed); rt.put_c(' '); rt.put_n(rt.syscall(55, 0, 0, 0)); rt.put_c(' '); + rt.put_n(rt.syscall(55, 1, 0, 0)); rt.put_c(' '); rt.put_n(rt.syscall(55, 2, 0, 0)); rt.put_c(10); return 0; +} |
