* @list: list node in table list
* @handle: chain handle
* @location: location the chain was defined at
+ * @refcnt: reference counter
* @flags: chain flags
* @hookstr: unified and human readable hook name (base chains)
* @hooknum: hook number (base chains)
struct list_head list;
struct handle handle;
struct location location;
+ unsigned int refcnt;
uint32_t flags;
const char *hookstr;
unsigned int hooknum;
extern const char *chain_type_name_lookup(const char *name);
extern const char *chain_hookname_lookup(const char *name);
extern struct chain *chain_alloc(const char *name);
+extern struct chain *chain_get(struct chain *chain);
extern void chain_free(struct chain *chain);
extern void chain_add_hash(struct chain *chain, struct table *table);
extern struct chain *chain_lookup(const struct table *table,
struct chain *chain;
chain = xzalloc(sizeof(*chain));
+ chain->refcnt = 1;
init_list_head(&chain->rules);
init_list_head(&chain->scope.symbols);
if (name != NULL)
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);