diff options
author | dzwdz | 2022-07-10 23:32:22 +0200 |
---|---|---|
committer | dzwdz | 2022-07-10 23:32:22 +0200 |
commit | 8da0f7c04d3005f50d13d799a395d0ed8bad95ec (patch) | |
tree | b0810f2b13ea1faba8621f5f12e6bd437a852eaf /src/init | |
parent | d3be139a93c578d1e055bfd5f6f79eda312091f9 (diff) |
init/tests: semaphore pipe-based test
Diffstat (limited to 'src/init')
-rw-r--r-- | src/init/tests/semaphore.c | 87 |
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"); } |