rt/examples/donate.c

77 lines
1.4 KiB
C

#include <rt/assert.h>
#include <rt/mutex.h>
#include <rt/task.h>
#include <rt/trap.h>
#define MAX_SEQ 9
static int seq = 0;
static RT_MUTEX(mutex0);
static RT_MUTEX(mutex1);
static RT_MUTEX(mutex2);
static void sequence(int s)
{
rt_assert(s == seq, "sequence out of order");
++seq;
if (seq > MAX_SEQ)
{
rt_trap();
}
}
static void locker0(void)
{
rt_task_drop_privilege();
sequence(3);
rt_mutex_lock(&mutex0);
rt_mutex_lock(&mutex1);
sequence(5);
rt_mutex_unlock(&mutex1);
rt_mutex_unlock(&mutex0);
sequence(-1);
}
static void locker1(void)
{
rt_task_drop_privilege();
sequence(2);
rt_mutex_lock(&mutex1);
rt_task_sleep(20);
sequence(4);
rt_mutex_lock(&mutex2);
rt_mutex_unlock(&mutex1);
sequence(8);
rt_task_sleep(20);
sequence(-1);
}
static void spinner(void)
{
rt_task_drop_privilege();
sequence(1);
rt_task_sleep(10);
for (;;)
{
rt_task_yield();
}
}
static void donator(void)
{
rt_task_drop_privilege();
sequence(0);
rt_task_sleep(30);
rt_mutex_lock(&mutex0);
sequence(6);
rt_mutex_unlock(&mutex0);
sequence(7);
rt_assert(!rt_mutex_timedlock(&mutex2, 10), "donator timedlock succeeded");
sequence(9);
}
RT_TASK(locker0, RT_STACK_MIN, 3);
RT_TASK(locker1, RT_STACK_MIN, 2);
RT_TASK(spinner, RT_STACK_MIN, 1);
RT_TASK(donator, RT_STACK_MIN, 0);