summaryrefslogtreecommitdiffstats
path: root/src/libserver/symbols_cache.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-07-24 15:36:08 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-07-24 15:36:08 +0100
commitb6920395ca72e3d53c06de91c0dcdb9786699b27 (patch)
tree258b98abcf84d3e133fe5eaebaff63661897e2a5 /src/libserver/symbols_cache.c
parent396ad52afb3b2c49fc98ab12240d400cbc10a390 (diff)
downloadrspamd-b6920395ca72e3d53c06de91c0dcdb9786699b27.tar.gz
rspamd-b6920395ca72e3d53c06de91c0dcdb9786699b27.zip
[Minor] Fix topological order
Diffstat (limited to 'src/libserver/symbols_cache.c')
-rw-r--r--src/libserver/symbols_cache.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c
index 41783057b..4d82789b1 100644
--- a/src/libserver/symbols_cache.c
+++ b/src/libserver/symbols_cache.c
@@ -320,12 +320,8 @@ cache_logic_cmp (const void *p1, const void *p2, gpointer ud)
}
}
else {
- /*
- * Topological ordering is reverse, deps has HIGHER order than top level
- * elements. Hence, we swap w1 and w2 here.
- */
- w1 = o2;
- w2 = o1;
+ w1 = o1;
+ w2 = o2;
}
if (w2 > w1) {
@@ -407,12 +403,14 @@ rspamd_symbols_cache_tsort_visit (struct symbols_cache *cache,
}
TSORT_MARK_TEMP (it);
+ msg_debug_cache ("visiting node: %s (%d)", it->symbol, cur_order);
PTR_ARRAY_FOREACH (it->deps, i, dep) {
+ msg_debug_cache ("visiting dep: %s (%d)", dep->item->symbol, cur_order + 1);
rspamd_symbols_cache_tsort_visit (cache, dep->item, cur_order + 1);
}
- it->order |= cur_order;
+ it->order = cur_order;
TSORT_MARK_PERM (it);
}
@@ -434,8 +432,10 @@ rspamd_symbols_cache_resort (struct symbols_cache *cache)
if (!(it->type & (SYMBOL_TYPE_PREFILTER|
SYMBOL_TYPE_POSTFILTER|
SYMBOL_TYPE_COMPOSITE))) {
- it->order = 0;
- g_ptr_array_add (ord->d, it);
+ if (it->parent == -1 && it->func) {
+ it->order = 0;
+ g_ptr_array_add (ord->d, it);
+ }
}
}
@@ -459,7 +459,6 @@ rspamd_symbols_cache_resort (struct symbols_cache *cache)
g_ptr_array_sort_with_data (ord->d, cache_logic_cmp, cache);
cache->total_hits = total_hits;
-
if (cache->items_by_order) {
REF_RELEASE (cache->items_by_order);
}