diff --git a/include/haproxy/pattern-t.h b/include/haproxy/pattern-t.h index 35c4fd095..de1a308e1 100644 --- a/include/haproxy/pattern-t.h +++ b/include/haproxy/pattern-t.h @@ -22,6 +22,7 @@ #ifndef _HAPROXY_PATTERN_T_H #define _HAPROXY_PATTERN_T_H +#include #include #include @@ -107,7 +108,7 @@ struct pat_ref { char *reference; /* The reference name. */ char *display; /* String displayed to identify the pattern origin. */ struct list head; /* The head of the list of struct pat_ref_elt. */ - struct eb_root ebmb_root; /* The tree where pattern reference elements are attached. */ + struct ceb_root *ceb_root; /* The tree where pattern reference elements are attached. */ struct list pat; /* The head of the list of struct pattern_expr. */ unsigned int flags; /* flags PAT_REF_*. */ unsigned int curr_gen; /* current generation number (anything below can be removed) */ @@ -132,7 +133,7 @@ struct pat_ref_elt { char *sample; unsigned int gen_id; /* generation of pat_ref this was made for */ int line; - struct ebmb_node node; /* Node to attach this element to its ebtree. */ + struct ceb_node node; /* Node to attach this element to its ebtree. */ const char pattern[0]; // const only to make sure nobody tries to free it. }; diff --git a/src/pattern.c b/src/pattern.c index 3e25b88e7..997184139 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -1590,7 +1591,7 @@ void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt) HA_RWLOCK_WRUNLOCK(PATEXP_LOCK, &expr->lock); LIST_DELETE(&elt->list); - ebmb_delete(&elt->node); + cebs_item_delete(&ref->ceb_root, node, pattern, elt); free(elt->sample); free(elt); HA_ATOMIC_INC(&patterns_freed); @@ -1625,20 +1626,18 @@ int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt) */ int pat_ref_gen_delete(struct pat_ref *ref, unsigned int gen_id, const char *key) { - struct ebmb_node *node; + struct pat_ref_elt *elt, *next; int found = 0; /* delete pattern from reference */ - node = ebst_lookup(&ref->ebmb_root, key); - while (node) { - struct pat_ref_elt *elt; - - elt = ebmb_entry(node, struct pat_ref_elt, node); - node = ebmb_next_dup(node); + elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt); + while (elt) { if (elt->gen_id != gen_id) continue; + next = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt); pat_ref_delete_by_ptr(ref, elt); found = 1; + elt = next; } if (found) @@ -1662,20 +1661,15 @@ int pat_ref_delete(struct pat_ref *ref, const char *key) */ struct pat_ref_elt *pat_ref_gen_find_elt(struct pat_ref *ref, unsigned int gen_id, const char *key) { - struct ebmb_node *node; struct pat_ref_elt *elt; - node = ebst_lookup(&ref->ebmb_root, key); - while (node) { - elt = ebmb_entry(node, struct pat_ref_elt, node); + elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt); + while (elt) { if (elt->gen_id == gen_id) break; - node = ebmb_next_dup(node); + elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt); } - if (node) - return ebmb_entry(node, struct pat_ref_elt, node); - - return NULL; + return elt; } /* @@ -1790,24 +1784,22 @@ int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const cha return 0; } -static int pat_ref_set_from_node(struct pat_ref *ref, struct ebmb_node *node, const char *value, char **err) +static int pat_ref_set_from_elt(struct pat_ref *ref, struct pat_ref_elt *elt, const char *value, char **err) { - struct pat_ref_elt *elt; unsigned int gen; int first = 1; int found = 0; - while (node) { + while (elt) { char *tmp_err = NULL; - elt = ebmb_entry(node, struct pat_ref_elt, node); if (first) gen = elt->gen_id; else if (elt->gen_id != gen) { /* only consider duplicate elements from the same gen! */ continue; } - node = ebmb_next_dup(node); + if (!pat_ref_set_elt(ref, elt, value, &tmp_err)) { if (err) *err = tmp_err; @@ -1817,6 +1809,7 @@ static int pat_ref_set_from_node(struct pat_ref *ref, struct ebmb_node *node, co } found = 1; first = 0; + elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt); } if (!found) { @@ -1834,7 +1827,7 @@ static int pat_ref_set_from_node(struct pat_ref *ref, struct ebmb_node *node, co int pat_ref_set_elt_duplicate(struct pat_ref *ref, struct pat_ref_elt *elt, const char *value, char **err) { - return pat_ref_set_from_node(ref, &elt->node, value, err); + return pat_ref_set_from_elt(ref, elt, value, err); } /* This function modifies to the sample of all patterns matching @@ -1843,18 +1836,16 @@ int pat_ref_set_elt_duplicate(struct pat_ref *ref, struct pat_ref_elt *elt, cons int pat_ref_gen_set(struct pat_ref *ref, unsigned int gen_id, const char *key, const char *value, char **err) { - struct ebmb_node *node; struct pat_ref_elt *elt; /* Look for pattern in the reference. */ - node = ebst_lookup(&ref->ebmb_root, key); - while (node) { - elt = ebmb_entry(node, struct pat_ref_elt, node); + elt = cebs_item_lookup(&ref->ceb_root, node, pattern, key, struct pat_ref_elt); + while (elt) { if (elt->gen_id == gen_id) break; - node = ebmb_next_dup(node); + elt = cebs_item_next_dup(&ref->ceb_root, node, pattern, elt); } - return pat_ref_set_from_node(ref, node, value, err); + return pat_ref_set_from_elt(ref, elt, value, err); } /* This function modifies to the sample of all patterns matching @@ -1896,7 +1887,7 @@ static struct pat_ref *_pat_ref_new(const char *display, unsigned int flags) ref->revision = 0; ref->entry_cnt = 0; LIST_INIT(&ref->head); - ref->ebmb_root = EB_ROOT; + ref->ceb_root = NULL; LIST_INIT(&ref->pat); HA_RWLOCK_INIT(&ref->lock); event_hdl_sub_list_init(&ref->e_subs); @@ -2002,9 +1993,7 @@ struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, con elt->list_head = NULL; elt->tree_head = NULL; LIST_APPEND(&ref->head, &elt->list); - /* Even if calloc()'ed, ensure this node is not linked to a tree. */ - elt->node.node.leaf_p = NULL; - ebst_insert(&ref->ebmb_root, &elt->node); + cebs_item_insert(&ref->ceb_root, node, pattern, elt); HA_ATOMIC_INC(&patterns_added); return elt; fail: @@ -2178,7 +2167,7 @@ int pat_ref_purge_range(struct pat_ref *ref, uint from, uint to, int budget) pat_delete_gen(ref, elt); LIST_DELETE(&elt->list); - ebmb_delete(&elt->node); + cebs_item_delete(&ref->ceb_root, node, pattern, elt); free(elt->sample); free(elt); HA_ATOMIC_INC(&patterns_freed);