summaryrefslogtreecommitdiffstats
path: root/src/rule.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rule.c')
-rw-r--r--src/rule.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/rule.c b/src/rule.c
index 6e1b823a..6887a1a7 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -444,6 +444,7 @@ struct chain *chain_alloc(const char *name)
struct chain *chain;
chain = xzalloc(sizeof(*chain));
+ chain->refcnt = 1;
init_list_head(&chain->rules);
init_list_head(&chain->scope.symbols);
if (name != NULL)
@@ -453,10 +454,18 @@ struct chain *chain_alloc(const char *name)
return chain;
}
+struct chain *chain_get(struct chain *chain)
+{
+ chain->refcnt++;
+ return chain;
+}
+
void chain_free(struct chain *chain)
{
struct rule *rule, *next;
+ if (--chain->refcnt > 0)
+ return;
list_for_each_entry_safe(rule, next, &chain->rules, list)
rule_free(rule);
handle_free(&chain->handle);