77 lines
1.4 KiB
C
77 lines
1.4 KiB
C
#include <rt/assert.h>
|
|
#include <rt/mutex.h>
|
|
#include <rt/sem.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 (;;)
|
|
{
|
|
}
|
|
}
|
|
|
|
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);
|