rt/examples/queue.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, 0);