summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2015-07-06 13:52:09 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2015-08-18 01:13:35 +0200
commitc2f7d6a6b0629e521d91d5caed87061a1a697ce9 (patch)
tree4bf34cb0020e489b0bb5aceabf0333a6cec1849e
parent2c6702b391f12723f1d4cf258e4a24100e931da9 (diff)
rule: add reference counter to the table object
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>
-rw-r--r--include/rule.h3
-rw-r--r--src/rule.c10
2 files changed, 13 insertions, 0 deletions
diff --git a/include/rule.h b/include/rule.h
index adff92fb..4e688794 100644
--- a/include/rule.h
+++ b/include/rule.h
@@ -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);
diff --git a/src/rule.c b/src/rule.c
index ba2bf66d..7701e211 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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);