rt/cxx/examples/queue.cpp

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, 2);