diff options
Diffstat (limited to 'source/test/unittests/condition_variable.test.c')
-rw-r--r-- | source/test/unittests/condition_variable.test.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/source/test/unittests/condition_variable.test.c b/source/test/unittests/condition_variable.test.c new file mode 100644 index 0000000..c9d818a --- /dev/null +++ b/source/test/unittests/condition_variable.test.c @@ -0,0 +1,60 @@ +#include "../../kit/threads.h" + +#define KIT_TEST_FILE condition_variable +#include "../../kit_test/test.h" + +typedef struct { + mtx_t m; + cnd_t send; + cnd_t receive; + int value; +} test_data_t; + +static int test_run(void *p) { + test_data_t *data = (test_data_t *) p; + + mtx_lock(&data->m); + + data->value = 20; + mtx_unlock(&data->m); + cnd_broadcast(&data->send); + + cnd_wait(&data->receive, &data->m); + + data->value = 22; + cnd_broadcast(&data->send); + + mtx_unlock(&data->m); + + return 0; +} + +TEST("condition variable") { + test_data_t data; + REQUIRE(mtx_init(&data.m, mtx_plain) == thrd_success); + REQUIRE(cnd_init(&data.send) == thrd_success); + REQUIRE(cnd_init(&data.receive) == thrd_success); + data.value = 0; + + thrd_t t; + REQUIRE(thrd_create(&t, test_run, &data) == thrd_success); + + REQUIRE(mtx_lock(&data.m) == thrd_success); + + REQUIRE(cnd_wait(&data.send, &data.m) == thrd_success); + int x = data.value; + + REQUIRE(cnd_broadcast(&data.receive) == thrd_success); + + REQUIRE(cnd_wait(&data.send, &data.m) == thrd_success); + x += data.value; + + REQUIRE(mtx_unlock(&data.m) == thrd_success); + REQUIRE(thrd_join(t, NULL) == thrd_success); + + mtx_destroy(&data.m); + cnd_destroy(&data.send); + cnd_destroy(&data.receive); + + REQUIRE(x == 42); +} |