|  |  | 
|  | /* | 
|  | * Copyright (C) Igor Sysoev | 
|  | */ | 
|  |  | 
|  |  | 
|  | #ifndef _NGX_RBTREE_H_INCLUDED_ | 
|  | #define _NGX_RBTREE_H_INCLUDED_ | 
|  |  | 
|  |  | 
|  | #include <ngx_config.h> | 
|  | #include <ngx_core.h> | 
|  |  | 
|  |  | 
|  | typedef ngx_uint_t  ngx_rbtree_key_t; | 
|  | typedef ngx_int_t   ngx_rbtree_key_int_t; | 
|  |  | 
|  |  | 
|  | typedef struct ngx_rbtree_node_s  ngx_rbtree_node_t; | 
|  |  | 
|  | struct ngx_rbtree_node_s { | 
|  | ngx_rbtree_key_t       key; | 
|  | ngx_rbtree_node_t     *left; | 
|  | ngx_rbtree_node_t     *right; | 
|  | ngx_rbtree_node_t     *parent; | 
|  | char                   color; | 
|  | }; | 
|  |  | 
|  |  | 
|  | typedef struct ngx_rbtree_s  ngx_rbtree_t; | 
|  |  | 
|  | typedef ngx_rbtree_node_t *(*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root, | 
|  | ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); | 
|  |  | 
|  | struct ngx_rbtree_s { | 
|  | ngx_rbtree_node_t     *root; | 
|  | ngx_rbtree_node_t     *sentinel; | 
|  | /* ngx_rbtree_insert_pt   insert; */ | 
|  | }; | 
|  |  | 
|  |  | 
|  | void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree, | 
|  | ngx_rbtree_node_t *node); | 
|  | void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree, | 
|  | ngx_rbtree_node_t *node); | 
|  |  | 
|  |  | 
|  | static ngx_inline ngx_rbtree_node_t * | 
|  | ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) | 
|  | { | 
|  | while (node->left != sentinel) { | 
|  | node = node->left; | 
|  | } | 
|  |  | 
|  | return node; | 
|  | } | 
|  |  | 
|  |  | 
|  | #endif /* _NGX_RBTREE_H_INCLUDED_ */ |