summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/init/tests/semaphore.c87
1 files changed, 53 insertions, 34 deletions
diff --git a/src/init/tests/semaphore.c b/src/init/tests/semaphore.c
index e542f0b..cb47d41 100644
--- a/src/init/tests/semaphore.c
+++ b/src/init/tests/semaphore.c
@@ -5,66 +5,85 @@
#include <shared/flags.h>
#include <shared/syscalls.h>
-static void odd(struct evil_sem *sem1, struct evil_sem *sem2) {
- printf("1");
+static void odd(handle_t out, struct evil_sem *sem1, struct evil_sem *sem2) {
+ _syscall_write(out, "1", 1, -1);
esem_signal(sem1);
esem_wait(sem2);
- printf("3");
+ _syscall_write(out, "3", 1, -1);
esem_signal(sem1);
esem_wait(sem2);
- printf("5");
+ _syscall_write(out, "5", 1, -1);
esem_signal(sem1);
}
-static void even(struct evil_sem *sem1, struct evil_sem *sem2) {
+static void even(handle_t out, struct evil_sem *sem1, struct evil_sem *sem2) {
esem_wait(sem1);
- printf("2");
+ _syscall_write(out, "2", 1, -1);
esem_signal(sem2);
esem_wait(sem1);
- printf("4");
+ _syscall_write(out, "4", 1, -1);
esem_signal(sem2);
esem_wait(sem1);
- printf("6");
+ _syscall_write(out, "6", 1, -1);
esem_signal(sem2);
}
void test_semaphore(void) {
struct evil_sem *sem1, *sem2;
+ handle_t pipe[2];
+ assert(_syscall_pipe(pipe, 0) >= 0);
- // TODO pipe-based test
-
- sem1 = esem_new(0);
- sem2 = esem_new(0);
- assert(sem1 && sem2);
if (!_syscall_fork(0, NULL)) {
- odd(sem1, sem2);
- _syscall_exit(69);
- } else {
- even(sem1, sem2);
- assert(_syscall_await() == 69);
- }
- esem_free(sem1);
- esem_free(sem2);
+ sem1 = esem_new(0);
+ sem2 = esem_new(0);
+ assert(sem1 && sem2);
+ if (!_syscall_fork(0, NULL)) {
+ odd(pipe[1], sem1, sem2);
+ _syscall_exit(69);
+ } else {
+ even(pipe[1], sem1, sem2);
+ assert(_syscall_await() == 69);
+ }
+ esem_free(sem1);
+ esem_free(sem2);
- printf("\n");
+ _syscall_write(pipe[1], "|", 1, -1);
- sem1 = esem_new(0);
- sem2 = esem_new(0);
- assert(sem1 && sem2);
- if (!_syscall_fork(0, NULL)) {
- even(sem1, sem2);
- _syscall_exit(69);
+ sem1 = esem_new(0);
+ sem2 = esem_new(0);
+ assert(sem1 && sem2);
+ if (!_syscall_fork(0, NULL)) {
+ even(pipe[1], sem1, sem2);
+ _syscall_exit(69);
+ } else {
+ odd(pipe[1], sem1, sem2);
+ assert(_syscall_await() == 69);
+ _syscall_await();
+ }
+ esem_free(sem1);
+ esem_free(sem2);
+
+ _syscall_exit(0);
} else {
- odd(sem1, sem2);
- assert(_syscall_await() == 69);
+ _syscall_close(pipe[1]);
+
+ char buf[16];
+ size_t pos = 0;
+ for (;;) {
+ int ret = _syscall_read(pipe[0], buf + pos, sizeof(buf) - pos, 0);
+ if (ret < 0) break;
+ pos += ret;
+ }
+ buf[pos] = '\0'; // idc about the "potential" overflow
+ if (strcmp(buf, "123456|123456")) {
+ printf("%s\n", buf);
+ test_fail();
+ }
+
_syscall_await();
}
- esem_free(sem1);
- esem_free(sem2);
-
- printf("\n");
}