]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
rule: add reference counter to the table object
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 6 Jul 2015 11:52:09 +0000 (13:52 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 17 Aug 2015 23:13:35 +0000 (01:13 +0200)
We may hold multiple references to table objects in follow up patches when
adding object declarations to the cache.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/rule.h
src/rule.c

index adff92fbda4395fac68f803d8a5ed0c7f727b58d..4e68879442d6bdb09aea8c092883e2f7f71a1bf4 100644 (file)
@@ -76,6 +76,7 @@ enum table_flags {
  * @chains:    chains contained in the table
  * @sets:      sets contained in the table
  * @flags:     table flags
+ * @refcnt:    table reference counter
  */
 struct table {
        struct list_head        list;
@@ -85,9 +86,11 @@ struct table {
        struct list_head        chains;
        struct list_head        sets;
        enum table_flags        flags;
+       unsigned int            refcnt;
 };
 
 extern struct table *table_alloc(void);
+extern struct table *table_get(struct table *table);
 extern void table_free(struct table *table);
 extern void table_add_hash(struct table *table);
 extern struct table *table_lookup(const struct handle *h);
index ba2bf66dac98f12fb3b087228f4bf8af8a5b05c8..7701e211bbc70b3ca755bdefffcf7923aa9ffeaf 100644 (file)
@@ -588,6 +588,8 @@ struct table *table_alloc(void)
        init_list_head(&table->chains);
        init_list_head(&table->sets);
        init_list_head(&table->scope.symbols);
+       table->refcnt = 1;
+
        return table;
 }
 
@@ -595,6 +597,8 @@ void table_free(struct table *table)
 {
        struct chain *chain, *next;
 
+       if (--table->refcnt > 0)
+               return;
        list_for_each_entry_safe(chain, next, &table->chains, list)
                chain_free(chain);
        handle_free(&table->handle);
@@ -602,6 +606,12 @@ void table_free(struct table *table)
        xfree(table);
 }
 
+struct table *table_get(struct table *table)
+{
+       table->refcnt++;
+       return table;
+}
+
 void table_add_hash(struct table *table)
 {
        list_add_tail(&table->list, &table_list);