diff options
author | Mitya Selivanov <0x7fffff@guattari.ru> | 2022-08-18 06:50:13 +0400 |
---|---|---|
committer | Mitya Selivanov <0x7fffff@guattari.ru> | 2022-08-18 06:50:13 +0400 |
commit | 5f80c8b54d011580383810597aa68565ddfb8f3c (patch) | |
tree | 3bf431e61e580a68de55840fa016dbfa0767d4e9 /source/test/unittests/condition_variable.test.c | |
parent | ac4face2d7d6d2b033874d3e6e24d2133c96132f (diff) | |
download | kit-5f80c8b54d011580383810597aa68565ddfb8f3c.zip |
[test] thread, mutex, condition variable
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); +} |