blob: 008db2a25e62a913c3ae00a97f701717927e0a57 [file] [log] [blame]
Igor Sysoevd90282d2004-09-28 08:34:51 +00001
2/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Igor Sysoevd90282d2004-09-28 08:34:51 +00004 */
5
6
Igor Sysoevf5003d82003-12-04 14:53:00 +00007#ifndef _NGX_RBTREE_H_INCLUDED_
8#define _NGX_RBTREE_H_INCLUDED_
9
10
11#include <ngx_config.h>
12#include <ngx_core.h>
13
14
Igor Sysoev208eed22005-10-07 13:30:52 +000015typedef ngx_uint_t ngx_rbtree_key_t;
16typedef ngx_int_t ngx_rbtree_key_int_t;
17
18
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000019typedef struct ngx_rbtree_node_s ngx_rbtree_node_t;
Igor Sysoevf5003d82003-12-04 14:53:00 +000020
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000021struct ngx_rbtree_node_s {
22 ngx_rbtree_key_t key;
23 ngx_rbtree_node_t *left;
24 ngx_rbtree_node_t *right;
25 ngx_rbtree_node_t *parent;
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000026 u_char color;
27 u_char data;
Igor Sysoevf5003d82003-12-04 14:53:00 +000028};
29
Igor Sysoev62260f22003-12-05 17:07:27 +000030
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000031typedef struct ngx_rbtree_s ngx_rbtree_t;
32
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000033typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000034 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
35
36struct ngx_rbtree_s {
37 ngx_rbtree_node_t *root;
38 ngx_rbtree_node_t *sentinel;
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000039 ngx_rbtree_insert_pt insert;
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000040};
Igor Sysoevf5003d82003-12-04 14:53:00 +000041
42
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000043void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
44 ngx_rbtree_node_t *node);
45void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
46 ngx_rbtree_node_t *node);
Igor Sysoevf4eb0172006-11-20 17:13:21 +000047void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node,
48 ngx_rbtree_node_t *sentinel);
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000049void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root,
50 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000051
52
53static ngx_inline ngx_rbtree_node_t *
54ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
Igor Sysoevf5003d82003-12-04 14:53:00 +000055{
Igor Sysoev208eed22005-10-07 13:30:52 +000056 while (node->left != sentinel) {
57 node = node->left;
58 }
Igor Sysoevf5003d82003-12-04 14:53:00 +000059
Igor Sysoev208eed22005-10-07 13:30:52 +000060 return node;
Igor Sysoevf5003d82003-12-04 14:53:00 +000061}
62
63
64#endif /* _NGX_RBTREE_H_INCLUDED_ */