aboutsummaryrefslogtreecommitdiff
path: root/include/kpl/queue.h
blob: 977a32d972257c238740d205aff2799ecbf23d7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#pragma once

// KPL atomic queues

#include "kpl/macro.h"

typedef struct _kpl_task kpl_task;

typedef struct {
    kpl_task *_Atomic head, *tail;
    struct {
       kpl_task *_Atomic next;
    } dummy;
} kpl_task_queue;

void kpl_task_queue_init(kpl_task_queue *task_queue);

void kpl_task_queue_add(kpl_task_queue *task_queue, kpl_task *task);

kpl_task *kpl_task_queue_next(kpl_task_queue *task_queue);

typedef enum : int8_t {
    KPL_RING_QUEUE_MIN_POW2     = 4,
    KPL_RING_QUEUE_MAX_POW2     = 30
} kpl_ring_queue_pow2_sizes;

typedef struct {
    _Atomic ssize_t index;
    void *data;
} kpl_ring_queue_item;

typedef struct {
    size_t items_mask;
    _Atomic ssize_t head_index, tail_index;
    kpl_ring_queue_item *items;
} kpl_ring_queue;

bool kpl_ring_queue_init(kpl_ring_queue *ring_queue, int8_t size_pow2);

void kpl_ring_queue_free(kpl_ring_queue *ring_queue);

bool kpl_ring_queue_add(kpl_ring_queue *ring_queue, void *data);

void *kpl_ring_queue_next(kpl_ring_queue *ring_queue);