Use ACCESS_RTE to guard **f_rte, use ACCESS_EATTRS to guard **f_eattrs.
Use f_rta_cow() before writing to rta or eattrs, use f_rte_cow() before
writing preference (stored in rte).
Do not access eattrs indirectly through (*f_rte)->attrs->eattrs, it is
way too slow. The cached pointer is faster.
return;
*f_rte = rte_do_cow(*f_rte);
- f_eattrs = NULL;
}
/*
return val;
#define ACCESS_RTE \
- do { if (!f_rte) runtime("No route to access"); else f_cache_eattrs(); } while (0)
+ do { if (!f_rte) runtime("No route to access"); } while (0)
#define ACCESS_EATTRS \
do { if (!f_eattrs) f_cache_eattrs(); } while (0)
DBG( "Running filter `%s'...", filter->name );
f_rte = rte;
+ f_eattrs = NULL;
f_old_rta = NULL;
f_pool = tmp_pool;
f_flags = flags;
{
f_rte = rte;
+ f_eattrs = NULL;
f_old_rta = NULL;
f_pool = tmp_pool;
f_flags = 0;
f_eval(struct f_inst *expr, struct linpool *tmp_pool)
{
f_flags = 0;
+ f_eattrs = NULL;
f_rte = NULL;
f_pool = tmp_pool;