From 6ebf1e5b3058161fe52c142448bfa497d1628e51 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sun, 29 Mar 2015 22:03:14 +0100 Subject: [PATCH] Use advanced priorities when planning evaluation. --- src/libutil/expression.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libutil/expression.c b/src/libutil/expression.c index d656db37b..2d52419fa 100644 --- a/src/libutil/expression.c +++ b/src/libutil/expression.c @@ -414,12 +414,29 @@ rspamd_ast_priority_traverse (GNode *node, gpointer d) return FALSE; } +#define ATOM_PRIORITY(a) ((a)->p.atom->hits / ((a)->p.atom->avg_ticks > 0 ? \ + (a)->p.atom->avg_ticks * 10000000 : 1.0)) + static gint rspamd_ast_priority_cmp (GNode *a, GNode *b) { struct rspamd_expression_elt *ea = a->data, *eb = b->data; + gdouble w1, w2; + + /* Special logic for atoms */ + if (ea->type == ELT_ATOM && eb->type == ELT_ATOM && + ea->priority == eb->priority) { + w1 = ATOM_PRIORITY (ea); + w2 = ATOM_PRIORITY (eb); - return ea->priority - eb->priority; + ea->p.atom->hits = 0; + ea->p.atom->avg_ticks = 0.0; + + return w1 - w2; + } + else { + return ea->priority - eb->priority; + } } static gboolean @@ -843,6 +860,10 @@ rspamd_ast_process_node (struct rspamd_expression *expr, gint flags, GNode *node elt->value = expr->subr->process (data, elt->p.atom); + if (elt->value) { + elt->p.atom->hits ++; + } + if (calc_ticks) { t2 = rspamd_get_ticks (); elt->p.atom->avg_ticks += ((t2 - t1) - elt->p.atom->avg_ticks) / -- 2.39.5