From: Martin Willi Date: Wed, 23 Oct 2013 12:14:21 +0000 (+0200) Subject: unit-tests: Add a spinlock test case X-Git-Tag: 5.1.2dr1~33^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1bfe595601cf3806c4831d0c7607be833d6608f;p=thirdparty%2Fstrongswan.git unit-tests: Add a spinlock test case --- diff --git a/src/libstrongswan/tests/suites/test_threading.c b/src/libstrongswan/tests/suites/test_threading.c index 49b249ae9d..295b647ab6 100644 --- a/src/libstrongswan/tests/suites/test_threading.c +++ b/src/libstrongswan/tests/suites/test_threading.c @@ -24,6 +24,7 @@ #include #include #include +#include #include /******************************************************************************* @@ -183,6 +184,50 @@ START_TEST(test_mutex) } END_TEST +/** + * Spinlock for testing + */ +static spinlock_t *spinlock; + +static void *spinlock_run(void *data) +{ + int i, *locked = (int*)data; + + barrier_wait(barrier); + + for (i = 0; i < 1000; i++) + { + spinlock->lock(spinlock); + (*locked)++; + ck_assert_int_eq(*locked, 1); + (*locked)--; + spinlock->unlock(spinlock); + } + return NULL; +} + +START_TEST(test_spinlock) +{ + thread_t *threads[THREADS]; + int i, locked = 0; + + barrier = barrier_create(THREADS); + spinlock = spinlock_create(); + + for (i = 0; i < THREADS; i++) + { + threads[i] = thread_create(spinlock_run, &locked); + } + for (i = 0; i < THREADS; i++) + { + threads[i]->join(threads[i]); + } + + spinlock->destroy(spinlock); + barrier_destroy(barrier); +} +END_TEST + static void *condvar_run(void *data) { mutex->lock(mutex); @@ -1229,6 +1274,10 @@ Suite *threading_suite_create() tcase_add_test(tc, test_mutex); suite_add_tcase(s, tc); + tc = tcase_create("spinlock"); + tcase_add_test(tc, test_spinlock); + suite_add_tcase(s, tc); + tc = tcase_create("condvar"); tcase_add_test(tc, test_condvar); tcase_add_test(tc, test_condvar_recursive);