/* libcr_ipc/tests/test_sema.c - Tests for * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #define IMPLEMENTATION_FOR_LIBCR_IPC_SEMA_H YES /* so we can access .cnt */ #include #include "test.h" int counter = 0; COROUTINE first_cr(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); cr_sema_wait(sema); counter++; cr_sema_signal(sema); cr_exit(); } COROUTINE second_cr(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 producer_cr(void *_sema) { cr_sema_t *sema = _sema; cr_begin(); for (int i = 0; i < 10; i++) cr_sema_signal(sema); cr_end(); } COROUTINE consumer_cr(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 = {}; printf("== test 1 =========================================\n"); coroutine_add("first", first_cr, &sema); coroutine_add("second", second_cr, &sema); coroutine_main(); test_assert(sema.cnt == 0); printf("== test 2 =========================================\n"); coroutine_add("consumer", consumer_cr, &sema); coroutine_add("producer", producer_cr, &sema); coroutine_main(); coroutine_add("consumer", consumer_cr, &sema); coroutine_main(); test_assert(sema.cnt == 0); return 0; }