#include #include #include #include #include #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);