rt/examples/rwlock.c

47 lines
829 B
C

#include <rt/assert.h>
#include <rt/log.h>
#include <rt/rwlock.h>
#include <rt/task.h>
#include <rt/trap.h>
static RT_RWLOCK(lock);
static unsigned x = 0;
static unsigned y = 0;
static void reader(void)
{
rt_task_drop_privilege();
for (;;)
{
rt_rwlock_rdlock(&lock);
rt_assert(x == y, "x and y do not match");
rt_rwlock_unlock(&lock);
}
}
static void writer(void)
{
rt_task_drop_privilege();
for (;;)
{
rt_rwlock_wrlock(&lock);
++x;
++y;
rt_rwlock_unlock(&lock);
}
}
static void timeout(void)
{
rt_task_drop_privilege();
rt_task_sleep(100);
rt_trap();
}
#define STACK_SIZE (RT_STACK_MIN * 2)
RT_TASK(reader, STACK_SIZE, 2);
RT_TASK(reader, STACK_SIZE, 2);
RT_TASK(writer, STACK_SIZE, 1);
RT_TASK(timeout, RT_STACK_MIN, 0);