Coverage Report

Created: 2023-11-07 06:43

/src/unit/src/nxt_nncq.h
Line
Count
Source (jump to first uncovered line)
1
2
/*
3
 * Copyright (C) NGINX, Inc.
4
 */
5
6
#ifndef _NXT_NNCQ_H_INCLUDED_
7
#define _NXT_NNCQ_H_INCLUDED_
8
9
10
/* Numeric Naive Circular Queue */
11
12
0
#define NXT_NNCQ_SIZE  16384
13
14
typedef uint32_t nxt_nncq_atomic_t;
15
typedef uint16_t nxt_nncq_cycle_t;
16
17
typedef struct {
18
    nxt_nncq_atomic_t  head;
19
    nxt_nncq_atomic_t  entries[NXT_NNCQ_SIZE];
20
    nxt_nncq_atomic_t  tail;
21
} nxt_nncq_t;
22
23
24
static inline nxt_nncq_atomic_t
25
nxt_nncq_head(nxt_nncq_t const volatile *q)
26
0
{
27
0
    return q->head;
28
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_head
Unexecuted instantiation: nxt_port.c:nxt_nncq_head
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_head
Unexecuted instantiation: nxt_router.c:nxt_nncq_head
29
30
31
static inline nxt_nncq_atomic_t
32
nxt_nncq_tail(nxt_nncq_t const volatile *q)
33
0
{
34
0
    return q->tail;
35
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_tail
Unexecuted instantiation: nxt_port.c:nxt_nncq_tail
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_tail
Unexecuted instantiation: nxt_router.c:nxt_nncq_tail
36
37
38
static inline void
39
nxt_nncq_tail_cmp_inc(nxt_nncq_t volatile *q, nxt_nncq_atomic_t t)
40
0
{
41
0
    nxt_atomic_cmp_set(&q->tail, t, t + 1);
42
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_tail_cmp_inc
Unexecuted instantiation: nxt_port.c:nxt_nncq_tail_cmp_inc
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_tail_cmp_inc
Unexecuted instantiation: nxt_router.c:nxt_nncq_tail_cmp_inc
43
44
45
static inline nxt_nncq_atomic_t
46
nxt_nncq_index(nxt_nncq_t const volatile *q, nxt_nncq_atomic_t i)
47
0
{
48
0
    return i % NXT_NNCQ_SIZE;
49
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_index
Unexecuted instantiation: nxt_port.c:nxt_nncq_index
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_index
Unexecuted instantiation: nxt_router.c:nxt_nncq_index
50
51
52
static inline nxt_nncq_atomic_t
53
nxt_nncq_map(nxt_nncq_t const volatile *q, nxt_nncq_atomic_t i)
54
0
{
55
0
    return i % NXT_NNCQ_SIZE;
56
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_map
Unexecuted instantiation: nxt_port.c:nxt_nncq_map
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_map
Unexecuted instantiation: nxt_router.c:nxt_nncq_map
57
58
59
static inline nxt_nncq_cycle_t
60
nxt_nncq_cycle(nxt_nncq_t const volatile *q, nxt_nncq_atomic_t i)
61
0
{
62
0
    return i / NXT_NNCQ_SIZE;
63
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_cycle
Unexecuted instantiation: nxt_port.c:nxt_nncq_cycle
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_cycle
Unexecuted instantiation: nxt_router.c:nxt_nncq_cycle
64
65
66
static inline nxt_nncq_cycle_t
67
nxt_nncq_next_cycle(nxt_nncq_t const volatile *q, nxt_nncq_cycle_t i)
68
0
{
69
0
    return i + 1;
70
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_next_cycle
Unexecuted instantiation: nxt_port.c:nxt_nncq_next_cycle
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_next_cycle
Unexecuted instantiation: nxt_router.c:nxt_nncq_next_cycle
71
72
73
static inline nxt_nncq_atomic_t
74
nxt_nncq_new_entry(nxt_nncq_t const volatile *q, nxt_nncq_cycle_t cycle,
75
    nxt_nncq_atomic_t i)
76
0
{
77
0
    return cycle * NXT_NNCQ_SIZE + (i % NXT_NNCQ_SIZE);
78
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_new_entry
Unexecuted instantiation: nxt_port.c:nxt_nncq_new_entry
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_new_entry
Unexecuted instantiation: nxt_router.c:nxt_nncq_new_entry
79
80
81
static inline nxt_nncq_atomic_t
82
nxt_nncq_empty(nxt_nncq_t const volatile *q)
83
0
{
84
0
    return NXT_NNCQ_SIZE;
85
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_empty
Unexecuted instantiation: nxt_port.c:nxt_nncq_empty
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_empty
Unexecuted instantiation: nxt_router.c:nxt_nncq_empty
86
87
88
static inline void
89
nxt_nncq_init(nxt_nncq_t volatile *q)
90
0
{
91
0
    q->head = NXT_NNCQ_SIZE;
92
0
    nxt_memzero((void *) q->entries, NXT_NNCQ_SIZE * sizeof(nxt_nncq_atomic_t));
93
0
    q->tail = NXT_NNCQ_SIZE;
94
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_init
Unexecuted instantiation: nxt_port.c:nxt_nncq_init
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_init
Unexecuted instantiation: nxt_router.c:nxt_nncq_init
95
96
97
static inline void
98
nxt_nncq_enqueue(nxt_nncq_t volatile *q, nxt_nncq_atomic_t val)
99
0
{
100
0
    nxt_nncq_cycle_t   e_cycle, t_cycle;
101
0
    nxt_nncq_atomic_t  n, t, e, j;
102
103
0
    for ( ;; ) {
104
0
        t = nxt_nncq_tail(q);
105
0
        j = nxt_nncq_map(q, t);
106
0
        e = q->entries[j];
107
108
0
        e_cycle = nxt_nncq_cycle(q, e);
109
0
        t_cycle = nxt_nncq_cycle(q, t);
110
111
0
        if (e_cycle == t_cycle) {
112
0
            nxt_nncq_tail_cmp_inc(q, t);
113
0
            continue;
114
0
        }
115
116
0
        if (nxt_nncq_next_cycle(q, e_cycle) != t_cycle) {
117
0
            continue;
118
0
        }
119
120
0
        n = nxt_nncq_new_entry(q, t_cycle, val);
121
122
0
        if (nxt_atomic_cmp_set(&q->entries[j], e, n)) {
123
0
            break;
124
0
        }
125
0
    }
126
127
0
    nxt_nncq_tail_cmp_inc(q, t);
128
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_enqueue
Unexecuted instantiation: nxt_port.c:nxt_nncq_enqueue
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_enqueue
Unexecuted instantiation: nxt_router.c:nxt_nncq_enqueue
129
130
131
static inline nxt_nncq_atomic_t
132
nxt_nncq_dequeue(nxt_nncq_t volatile *q)
133
0
{
134
0
    nxt_nncq_cycle_t   e_cycle, h_cycle;
135
0
    nxt_nncq_atomic_t  h, j, e;
136
137
0
    for ( ;; ) {
138
0
        h = nxt_nncq_head(q);
139
0
        j = nxt_nncq_map(q, h);
140
0
        e = q->entries[j];
141
142
0
        e_cycle = nxt_nncq_cycle(q, e);
143
0
        h_cycle = nxt_nncq_cycle(q, h);
144
145
0
        if (e_cycle != h_cycle) {
146
0
            if (nxt_nncq_next_cycle(q, e_cycle) == h_cycle) {
147
0
                return nxt_nncq_empty(q);
148
0
            }
149
150
0
            continue;
151
0
        }
152
153
0
        if (nxt_atomic_cmp_set(&q->head, h, h + 1)) {
154
0
            break;
155
0
        }
156
0
    }
157
158
0
    return nxt_nncq_index(q, e);
159
0
}
Unexecuted instantiation: nxt_port_socket.c:nxt_nncq_dequeue
Unexecuted instantiation: nxt_port.c:nxt_nncq_dequeue
Unexecuted instantiation: nxt_main_process.c:nxt_nncq_dequeue
Unexecuted instantiation: nxt_router.c:nxt_nncq_dequeue
160
161
162
#endif /* _NXT_NNCQ_H_INCLUDED_ */