diff options
author | Martin Willi <martin@revosec.ch> | 2014-10-22 11:23:49 +0200 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-10-30 10:45:24 +0100 |
commit | 6a3f0467e48dfbced121ac9e1ac818de9b7292e1 (patch) | |
tree | 334be2b6f337b9f50a8b52703f01c60662e38244 /src/libstrongswan/tests/suites/test_threading.c | |
parent | b0891697522da6cb5e421800d6b44cd1f71f10e4 (diff) | |
download | strongswan-6a3f0467e48dfbced121ac9e1ac818de9b7292e1.tar.bz2 strongswan-6a3f0467e48dfbced121ac9e1ac818de9b7292e1.tar.xz |
threading: Add a more explicit rwlock try_write_lock() testing
Diffstat (limited to 'src/libstrongswan/tests/suites/test_threading.c')
-rw-r--r-- | src/libstrongswan/tests/suites/test_threading.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/libstrongswan/tests/suites/test_threading.c b/src/libstrongswan/tests/suites/test_threading.c index 47e448484..7f17a9c6c 100644 --- a/src/libstrongswan/tests/suites/test_threading.c +++ b/src/libstrongswan/tests/suites/test_threading.c @@ -553,6 +553,49 @@ START_TEST(test_rwlock) } END_TEST +static void *rwlock_try_run(void *param) +{ + if (rwlock->try_write_lock(rwlock)) + { + rwlock->unlock(rwlock); + return param; + } + return NULL; +} + +START_TEST(test_rwlock_try) +{ + uintptr_t magic = 0xcafebabe; + thread_t *thread; + + rwlock = rwlock_create(RWLOCK_TYPE_DEFAULT); + + thread = thread_create(rwlock_try_run, (void*)magic); + ck_assert_int_eq((uintptr_t)thread->join(thread), magic); + + rwlock->read_lock(rwlock); + thread = thread_create(rwlock_try_run, (void*)magic); + ck_assert(thread->join(thread) == NULL); + rwlock->unlock(rwlock); + + rwlock->read_lock(rwlock); + rwlock->read_lock(rwlock); + rwlock->read_lock(rwlock); + thread = thread_create(rwlock_try_run, (void*)magic); + ck_assert(thread->join(thread) == NULL); + rwlock->unlock(rwlock); + rwlock->unlock(rwlock); + rwlock->unlock(rwlock); + + rwlock->write_lock(rwlock); + thread = thread_create(rwlock_try_run, (void*)magic); + ck_assert(thread->join(thread) == NULL); + rwlock->unlock(rwlock); + + rwlock->destroy(rwlock); +} +END_TEST + /** * Rwlock condvar */ @@ -1423,6 +1466,7 @@ Suite *threading_suite_create() tc = tcase_create("rwlock"); tcase_add_test(tc, test_rwlock); + tcase_add_test(tc, test_rwlock_try); suite_add_tcase(s, tc); tc = tcase_create("rwlock condvar"); |