#include <stdio.h>
#include <unistd.h>
#include <assert.h>
+#include <limits.h>
#include <list.h>
#include <gmputil.h>
#define __must_be_array(a) \
BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
+#define assert_refcount_safe(refcnt) do { \
+ if ((refcnt) == 0) \
+ BUG("refcount was 0"); \
+ if ((refcnt) >= INT_MAX) \
+ BUG("refcount saturated"); \
+} while (0)
+
#define container_of(ptr, type, member) ({ \
typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (void *)__mptr - offsetof(type,member) );})
struct expr *expr_get(struct expr *expr)
{
+ assert_refcount_safe(expr->refcnt);
expr->refcnt++;
return expr;
}
{
if (expr == NULL)
return;
+
+ assert_refcount_safe(expr->refcnt);
if (--expr->refcnt > 0)
return;
new->scope = expr->scope;
new->sym = expr->sym;
+ assert_refcount_safe(expr->sym->refcnt);
expr->sym->refcnt++;
}
static void variable_expr_destroy(struct expr *expr)
{
+ assert_refcount_safe(expr->sym->refcnt);
expr->sym->refcnt--;
}
struct set *set_get(struct set *set)
{
+ assert_refcount_safe(set->refcnt);
set->refcnt++;
return set;
}
{
struct stmt *stmt, *next;
+ assert_refcount_safe(set->refcnt);
if (--set->refcnt > 0)
return;
struct rule *rule_get(struct rule *rule)
{
+ assert_refcount_safe(rule->refcnt);
rule->refcnt++;
return rule;
}
void rule_free(struct rule *rule)
{
+ assert_refcount_safe(rule->refcnt);
if (--rule->refcnt > 0)
return;
stmt_list_free(&rule->stmts);
if (!sym)
return NULL;
+ assert_refcount_safe(sym->refcnt);
sym->refcnt++;
return sym;
static void symbol_put(struct symbol *sym)
{
+ assert_refcount_safe(sym->refcnt);
if (--sym->refcnt == 0) {
free_const(sym->identifier);
expr_free(sym->expr);
struct chain *chain_get(struct chain *chain)
{
+ assert_refcount_safe(chain->refcnt);
chain->refcnt++;
return chain;
}
struct rule *rule, *next;
int i;
+ assert_refcount_safe(chain->refcnt);
if (--chain->refcnt > 0)
return;
list_for_each_entry_safe(rule, next, &chain->rules, list)
struct set *set, *nset;
struct obj *obj, *nobj;
+ assert_refcount_safe(table->refcnt);
if (--table->refcnt > 0)
return;
if (table->comment)
struct table *table_get(struct table *table)
{
+ assert_refcount_safe(table->refcnt);
table->refcnt++;
return table;
}
struct obj *obj_get(struct obj *obj)
{
+ assert_refcount_safe(obj->refcnt);
obj->refcnt++;
return obj;
}
void obj_free(struct obj *obj)
{
+ assert_refcount_safe(obj->refcnt);
if (--obj->refcnt > 0)
return;
free_const(obj->comment);
struct flowtable *flowtable_get(struct flowtable *flowtable)
{
+ assert_refcount_safe(flowtable->refcnt);
flowtable->refcnt++;
return flowtable;
}
{
int i;
+ assert_refcount_safe(flowtable->refcnt);
if (--flowtable->refcnt > 0)
return;
handle_free(&flowtable->handle);