55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
#include <rt/assert.h>
|
|
#include <rt/atomic.h>
|
|
#include <rt/log.h>
|
|
#include <rt/queue.h>
|
|
#include <rt/task.h>
|
|
#include <rt/trap.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
RT_QUEUE_STATIC(queue, uint32_t, 10);
|
|
|
|
static void pusher(uintptr_t i)
|
|
{
|
|
rt_task_drop_privilege();
|
|
uint32_t x = (uint32_t)i;
|
|
for (;;)
|
|
{
|
|
rt_queue_push(&queue, &x);
|
|
++x;
|
|
}
|
|
}
|
|
|
|
#define NPUSHERS 2
|
|
#define TASK_INC UINT32_C(0x1000000)
|
|
|
|
static uint32_t max_elem[NPUSHERS] = {0};
|
|
static rt_atomic_size_t num_popped = 0;
|
|
|
|
static void popper(void)
|
|
{
|
|
rt_task_drop_privilege();
|
|
uint32_t x;
|
|
for (;;)
|
|
{
|
|
rt_queue_pop(&queue, &x);
|
|
rt_atomic_fetch_add(&num_popped, 1, RT_ATOMIC_RELAXED);
|
|
uint32_t task = x / TASK_INC;
|
|
uint32_t elem = x % TASK_INC;
|
|
rt_assert(elem >= max_elem[task], "out of order");
|
|
max_elem[task] = elem;
|
|
}
|
|
}
|
|
|
|
static void timeout(void)
|
|
{
|
|
rt_task_drop_privilege();
|
|
rt_task_sleep(1000);
|
|
rt_trap();
|
|
}
|
|
|
|
RT_TASK(popper, RT_STACK_MIN, 1);
|
|
RT_TASK_ARG(pusher, 0, RT_STACK_MIN, 1);
|
|
RT_TASK_ARG(pusher, TASK_INC, RT_STACK_MIN, 1);
|
|
RT_TASK(timeout, RT_STACK_MIN, 2);
|