Files
libucore/test/test_ticket_lock.c
T
2014-09-11 21:55:57 +02:00

67 lines
1.4 KiB
C

#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);
sched_yield();
g_counter++;
uc_ticket_unlock(&lock);
}
return NULL;
}
#define NR_THREADS 5
START_TEST(test_ticket_lock1)
struct ThreadArg threads[NR_THREADS];
int i;
int lrc;
lrc = uc_ticket_lock_init(&lock);
ck_assert_int_eq(lrc, 0);
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;
}