/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_ */ |