Coverage Report

Created: 2025-11-01 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/unit/src/nxt_rbtree.h
Line
Count
Source
1
2
/*
3
 * Copyright (C) Igor Sysoev
4
 * Copyright (C) NGINX, Inc.
5
 */
6
7
#ifndef _NXT_RBTREE_H_INCLUDED_
8
#define _NXT_RBTREE_H_INCLUDED_
9
10
11
typedef struct nxt_rbtree_node_s  nxt_rbtree_node_t;
12
13
struct nxt_rbtree_node_s {
14
    nxt_rbtree_node_t         *left;
15
    nxt_rbtree_node_t         *right;
16
    nxt_rbtree_node_t         *parent;
17
18
    uint8_t                   color;
19
};
20
21
22
typedef struct {
23
    nxt_rbtree_node_t         *left;
24
    nxt_rbtree_node_t         *right;
25
    nxt_rbtree_node_t         *parent;
26
} nxt_rbtree_part_t;
27
28
29
#define NXT_RBTREE_NODE(node)                                                 \
30
    nxt_rbtree_part_t         node;                                           \
31
    uint8_t                   node##_color
32
33
34
0
#define NXT_RBTREE_NODE_INIT  { NULL, NULL, NULL }, 0
35
36
37
typedef struct {
38
    nxt_rbtree_node_t         sentinel;
39
} nxt_rbtree_t;
40
41
42
/*
43
 * A comparison function should return intptr_t result because
44
 * this eliminates overhead required to implement correct addresses
45
 * comparison without result truncation.
46
 */
47
typedef intptr_t (*nxt_rbtree_compare_t)(nxt_rbtree_node_t *node1,
48
    nxt_rbtree_node_t *node2);
49
50
51
#define nxt_rbtree_root(tree)                                                 \
52
279k
    ((tree)->sentinel.left)
53
54
55
#define nxt_rbtree_sentinel(tree)                                             \
56
279k
    (&(tree)->sentinel)
57
58
59
#define nxt_rbtree_is_empty(tree)                                             \
60
0
    (nxt_rbtree_root(tree) == nxt_rbtree_sentinel(tree))
61
62
63
#define nxt_rbtree_min(tree)                                                  \
64
0
    nxt_rbtree_branch_min(tree, &(tree)->sentinel)
65
66
67
nxt_inline nxt_rbtree_node_t *
68
nxt_rbtree_branch_min(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
69
74
{
70
103
    while (node->left != nxt_rbtree_sentinel(tree)) {
71
29
        node = node->left;
72
29
    }
73
74
74
    return node;
75
74
}
Unexecuted instantiation: nxt_json_fuzz.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_lib.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_errno.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_malloc.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_file.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_process.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_process_title.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_port_socket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_port_memory.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_port_rpc.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_port.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_random.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_mp.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_string.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_sprintf.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_log.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_murmur_hash.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_lvlhsh.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_array.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_buf.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_sendbuf.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_thread.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_thread_mutex.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_spinlock.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_thread_time.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_work_queue.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_service.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_log_moderation.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_event_engine.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_timer.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_runtime.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conf.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conf_validation.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_main_process.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_signal_handlers.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_controller.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_router.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_router_access_log.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_h1proto.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_status.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_request.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_response.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_error.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_route.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_route_addr.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_rewrite.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_set_headers.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_return.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_static.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_proxy.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_chunk_parse.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_variables.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_application.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_external.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_port_hash.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_websocket_accept.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_websocket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_h1proto_websocket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_fs.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_compression.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_epoll_engine.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_poll_engine.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_select_engine.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_linux_sendfile.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_clone.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_gmtime.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_time.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_mem_map.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_socket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_socketpair.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_socket_msg.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_credential.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_isolation.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_signal.c:nxt_rbtree_branch_min
nxt_rbtree.c:nxt_rbtree_branch_min
Line
Count
Source
69
74
{
70
103
    while (node->left != nxt_rbtree_sentinel(tree)) {
71
29
        node = node->left;
72
29
    }
73
74
74
    return node;
75
74
}
Unexecuted instantiation: nxt_utf8.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_parse.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_var.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_tstr.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_file_name.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_djb_hash.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_list.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_thread_pool.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn_connect.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn_accept.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn_read.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn_write.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_conn_close.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_sockaddr.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_listen_socket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_upstream.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_upstream_round_robin.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_parse.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_capability.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_sha1.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_websocket.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_fs_mount.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_recvbuf.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_semaphore.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_h1p_fuzz.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_h1p_peer_fuzz.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_basic_fuzz.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_time_parse.c:nxt_rbtree_branch_min
Unexecuted instantiation: nxt_http_controller_fuzz.c:nxt_rbtree_branch_min
76
77
78
#define nxt_rbtree_is_there_successor(tree, node)                             \
79
0
    ((node) != nxt_rbtree_sentinel(tree))
80
81
82
nxt_inline nxt_rbtree_node_t *
83
nxt_rbtree_node_successor(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
84
0
{
85
0
    nxt_rbtree_node_t  *parent;
86
87
0
    if (node->right != nxt_rbtree_sentinel(tree)) {
88
0
        return nxt_rbtree_branch_min(tree, node->right);
89
0
    }
90
91
0
    for ( ;; ) {
92
0
        parent = node->parent;
93
94
        /*
95
         * Explicit test for a root node is not required here, because
96
         * the root node is always the left child of the sentinel.
97
         */
98
0
        if (node == parent->left) {
99
0
            return parent;
100
0
        }
101
102
0
        node = parent;
103
0
    }
104
0
}
Unexecuted instantiation: nxt_json_fuzz.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_lib.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_errno.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_malloc.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_file.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_process.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_process_title.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_port_socket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_port_memory.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_port_rpc.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_port.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_random.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_mp.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_string.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_sprintf.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_log.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_murmur_hash.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_lvlhsh.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_array.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_buf.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_sendbuf.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_thread.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_thread_mutex.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_spinlock.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_thread_time.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_work_queue.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_service.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_log_moderation.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_event_engine.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_timer.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_runtime.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conf.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conf_validation.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_main_process.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_signal_handlers.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_controller.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_router.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_router_access_log.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_h1proto.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_status.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_request.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_response.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_error.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_route.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_route_addr.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_rewrite.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_set_headers.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_return.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_static.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_proxy.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_chunk_parse.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_variables.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_application.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_external.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_port_hash.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_websocket_accept.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_websocket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_h1proto_websocket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_fs.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_compression.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_epoll_engine.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_poll_engine.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_select_engine.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_linux_sendfile.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_clone.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_gmtime.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_time.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_mem_map.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_socket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_socketpair.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_socket_msg.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_credential.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_isolation.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_signal.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_rbtree.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_utf8.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_parse.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_var.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_tstr.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_file_name.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_djb_hash.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_list.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_thread_pool.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn_connect.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn_accept.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn_read.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn_write.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_conn_close.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_sockaddr.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_listen_socket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_upstream.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_upstream_round_robin.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_parse.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_capability.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_sha1.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_websocket.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_fs_mount.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_recvbuf.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_semaphore.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_h1p_fuzz.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_h1p_peer_fuzz.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_basic_fuzz.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_time_parse.c:nxt_rbtree_node_successor
Unexecuted instantiation: nxt_http_controller_fuzz.c:nxt_rbtree_node_successor
105
106
107
NXT_EXPORT void nxt_rbtree_init(nxt_rbtree_t *tree,
108
    nxt_rbtree_compare_t compare);
109
NXT_EXPORT void nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
110
NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find(nxt_rbtree_t *tree,
111
    nxt_rbtree_part_t *node);
112
NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree,
113
    nxt_rbtree_part_t *node);
114
NXT_EXPORT nxt_rbtree_node_t
115
    *nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree,
116
    nxt_rbtree_part_t *node);
117
NXT_EXPORT void nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
118
119
/*
120
 * nxt_rbtree_destroy_next() is iterator to use only while rbtree destruction.
121
 * It deletes a node from rbtree and returns the node.  The rbtree is not
122
 * rebalanced after deletion.  At the beginning the "next" parameter should
123
 * be equal to rbtree root.  The iterator should be called in loop until
124
 * the "next" parameter will be equal to the rbtree sentinel.  No other
125
 * operations must be performed on the rbtree while destruction.
126
 */
127
NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_destroy_next(nxt_rbtree_t *tree,
128
    nxt_rbtree_node_t **next);
129
130
131
#endif /* _NXT_RBTREE_H_INCLUDED_ */