Add test for ticket locks

This commit is contained in:
Nils O. Selåsdal
2014-06-25 19:49:14 +02:00
parent 0a6ce86779
commit 32218b3dc7
2 changed files with 66 additions and 1 deletions
+3 -1
View File
@@ -30,6 +30,7 @@ extern Suite *htable_suite(void);
extern Suite *heapsort_suite(void); extern Suite *heapsort_suite(void);
extern Suite *dstr_suite(void); extern Suite *dstr_suite(void);
extern Suite *val_str_suite(void); extern Suite *val_str_suite(void);
extern Suite *ticket_lock_suite(void);
static suite_func suites[] = { static suite_func suites[] = {
bitvec_suite, bitvec_suite,
@@ -54,7 +55,8 @@ static suite_func suites[] = {
threadqueue_suite, threadqueue_suite,
heapsort_suite, heapsort_suite,
dstr_suite, dstr_suite,
val_str_suite val_str_suite,
ticket_lock_suite
}; };
int int
+63
View File
@@ -0,0 +1,63 @@
#include <check.h>
#include <stdio.h>
#include <pthread.h>
#include <ucore/ticket_lock.h>
//this is intended more as an example
//verifying multithreaded locks requires a more formal approach
static int g_counter;
static struct UCTicketLock lock;
struct ThreadArg {
int rounds;
pthread_t tid;
};
static void *update_thread(void *arg)
{
int i;
struct ThreadArg *targ = arg;
for (i = 0; i < targ->rounds; i++) {
uc_ticket_lock(&lock);
g_counter++;
uc_ticket_unlock(&lock);
}
return NULL;
}
#define NR_THREADS 5
START_TEST(test_ticket_lock1)
struct ThreadArg threads[NR_THREADS];
int i;
printf("TICKET SUITE\n");
for (i = 0; i < NR_THREADS; i++) {
int rc;
threads[i].rounds = NR_THREADS - i;
rc = pthread_create(&threads[i].tid, NULL, update_thread, &threads[i]);
ck_assert_int_eq(0, rc);
}
for (i = 0; i < NR_THREADS; i++) {
int rc;
rc = pthread_join(threads[i].tid, NULL);
ck_assert_int_eq(0, rc);
}
//should be sum of integers from 1 .. NR_THREADS
ck_assert_int_eq((NR_THREADS * (NR_THREADS + 1)) / 2, g_counter);
END_TEST
Suite *ticket_lock_suite(void)
{
Suite *s = suite_create("ticket_lock");
TCase *tc = tcase_create("ticket_lock tests");
tcase_add_test(tc, test_ticket_lock1);
suite_add_tcase(s, tc);
return s;
}