/* libcr_ipc/tests/test_rwmutex.c - Tests for * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include #include "test.h" cr_rwmutex_t mu = {}; char out[10] = {0}; size_t len = 0; COROUTINE cr1_reader(void *_mu) { cr_rwmutex_t *mu = _mu; cr_begin(); cr_rwmutex_rlock(mu); out[len++] = 'r'; cr_yield(); cr_rwmutex_runlock(mu); cr_end(); } COROUTINE cr1_writer(void *_mu) { cr_rwmutex_t *mu = _mu; cr_begin(); cr_rwmutex_lock(mu); out[len++] = 'w'; cr_yield(); cr_rwmutex_unlock(mu); cr_end(); } COROUTINE cr2_waiter(void *_ch) { char ch = *(char *)_ch; cr_begin(); cr_rwmutex_rlock(&mu); out[len++] = ch; cr_rwmutex_runlock(&mu); cr_end(); } COROUTINE cr2_init(void *) { cr_begin(); char ch; cr_rwmutex_lock(&mu); ch = 'a'; coroutine_add("wait-a", cr2_waiter, &ch); ch = 'b'; coroutine_add("wait-b", cr2_waiter, &ch); cr_yield(); ch = 'c'; coroutine_add("wait-c", cr2_waiter, &ch); cr_rwmutex_unlock(&mu); cr_end(); } int main() { printf("== test 1 =========================================\n"); coroutine_add("r1", cr1_reader, &mu); coroutine_add("r2", cr1_reader, &mu); coroutine_add("w", cr1_writer, &mu); coroutine_add("r3", cr1_reader, &mu); coroutine_add("r4", cr1_reader, &mu); coroutine_main(); test_assert(len == 5); test_assert(strcmp(out, "rrwrr") == 0); printf("== test 2 =========================================\n"); mu = (cr_rwmutex_t){}; len = 0; memset(out, 0, sizeof(out)); coroutine_add("init", cr2_init, NULL); coroutine_main(); test_assert(len == 3); test_assert(strcmp(out, "abc") == 0); return 0; }