55 lines
1.1 KiB
C++
55 lines
1.1 KiB
C++
#include <rt/queue.hpp>
|
|
#include <rt/task.hpp>
|
|
#include <rt/trap.hpp>
|
|
|
|
#include <rt/assert.h>
|
|
#include <rt/atomic.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
static rt::queue<uint32_t, 10> queue;
|
|
|
|
static void pusher(uintptr_t i)
|
|
{
|
|
rt::task::drop_privilege();
|
|
uint32_t x = (uint32_t)i;
|
|
for (;;)
|
|
{
|
|
queue.push(x);
|
|
++x;
|
|
}
|
|
}
|
|
|
|
#define NPUSHERS 3
|
|
#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 (;;)
|
|
{
|
|
queue.pop(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, 0);
|