From d4164dcd4acabe34106d8ea9fd3ce9da210ca0f0 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 27 Oct 2020 18:55:20 +0100 Subject: [PATCH] CLEANUP: pattern: delete the back refs at once during pat_ref_reload() It's pointless to delete a backref and relink it to the next entry since the next entry is going to do the exact same and so on until all of them are deleted. Let's simply delete backrefs on reload. --- src/pattern.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/pattern.c b/src/pattern.c index 328c51416..e4a1e2785 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -2033,15 +2033,9 @@ void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace) /* all expr are locked, we can safely remove all pat_ref */ list_for_each_entry_safe(elt, safe, &ref->head, list) { list_for_each_entry_safe(bref, back, &elt->back_refs, users) { - /* - * we have to unlink all watchers. We must not relink them if - * this elt was the last one in the list. - */ - LIST_DEL(&bref->users); - LIST_INIT(&bref->users); - if (elt->list.n != &ref->head) - LIST_ADDQ(&LIST_ELEM(elt->list.n, typeof(elt), list)->back_refs, &bref->users); - bref->ref = elt->list.n; + /* we have to unlink all watchers. */ + LIST_DEL_INIT(&bref->users); + bref->ref = NULL; } LIST_DEL(&elt->list); free(elt->pattern);