Files
mkrtos-real/mkrtos_knl/knl/futex_queue.c
zhangzheng 5fc71a7f98 优化futex
2023-11-27 21:47:44 +08:00

66 lines
1.3 KiB
C

#include "types.h"
#include "futex_queue.h"
#include <assert.h>
void fq_init(futex_queue_t *q)
{
q->front = 0;
q->rear = 0;
}
int fq_empty(futex_queue_t *q)
{
assert(q);
if (q->front == q->rear)
{
return 1;
}
else
{
return 0;
}
}
bool_t fq_is_full(futex_queue_t *q)
{
return (q->rear + 1) % FUTEX_QUEUE_LEN == q->front;
}
int fq_enqueue(futex_queue_t *q, umword_t e)
{
if (((q->rear + 1) % FUTEX_QUEUE_LEN) == q->front)
{
return -1;
}
q->m[q->rear] = e;
q->rear = (q->rear + 1) % FUTEX_QUEUE_LEN;
return 0;
}
int fq_dequeue(futex_queue_t *q, umword_t *e)
{
if (q->front == q->rear)
{
return -1;
}
*e = q->m[q->front];
q->front = (q->front + 1) % FUTEX_QUEUE_LEN;
return 0;
}
int fq_queue_len(futex_queue_t *q)
{
return (q->rear - q->front + FUTEX_QUEUE_LEN) % FUTEX_QUEUE_LEN;
}
int fq_queue_iter(futex_queue_t *q, futex_iter_func iter_func, void *data)
{
assert(iter_func);
int i;
int j = q->front;
int e = (q->rear - q->front + FUTEX_QUEUE_LEN) % FUTEX_QUEUE_LEN;
for (i = 0; i < e; i++)
{
int ret = iter_func(q->m[j], data);
if (ret < 0)
{
return ret;
}
j = (j + 1) % FUTEX_QUEUE_LEN;
}
}