/* libcr_ipc/tests/test_sema.c - Tests for * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include "test.h" int counter = 0; COROUTINE cr_first(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); cr_sema_wait(sema); counter++; cr_sema_signal(sema); cr_exit(); } COROUTINE cr_second(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); cr_sema_signal(sema); /* should be claimed by cr_first, which has been waiting */ cr_sema_wait(sema); /* should block, because cr_first claimed it */ test_assert(counter == 1); cr_exit(); } COROUTINE cr_producer(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); for (int i = 0; i < 10; i++) cr_sema_signal(sema); cr_end(); } COROUTINE cr_consumer(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); for (int i = 0; i < 5; i++) cr_sema_wait(sema); cr_end(); } int main() { cr_sema_t sema = {0}; printf("== test 1 =========================================\n"); coroutine_add("first", cr_first, &sema); coroutine_add("second", cr_second, &sema); coroutine_main(); test_assert(sema.cnt == 0); printf("== test 2 =========================================\n"); coroutine_add("consumer", cr_consumer, &sema); coroutine_add("producer", cr_producer, &sema); coroutine_main(); coroutine_add("consumer", cr_consumer, &sema); coroutine_main(); test_assert(sema.cnt == 0); return 0; }