]> source.dussan.org Git - rspamd.git/commitdiff
Use advanced priorities when planning evaluation.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 29 Mar 2015 21:03:14 +0000 (22:03 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 29 Mar 2015 21:03:14 +0000 (22:03 +0100)
src/libutil/expression.c

index d656db37b4e291a96c565a92ddcb333e68192de1..2d52419fa7c1940e1a010eceeafb7a6b73bf3108 100644 (file)
@@ -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) /