summaryrefslogtreecommitdiffstats
path: root/src/libserver/symbols_cache.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-22 22:44:18 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-22 22:44:58 +0000
commitfa44ef2fe0e3dca856d110303cd59e07f61aa58b (patch)
tree787e04edfb5805fae35ec674d9c36595ae0f17b6 /src/libserver/symbols_cache.c
parentbb68a7983c2b17b9acf7ff01e4ba21adbd600845 (diff)
downloadrspamd-fa44ef2fe0e3dca856d110303cd59e07f61aa58b.tar.gz
rspamd-fa44ef2fe0e3dca856d110303cd59e07f61aa58b.zip
[Minor] Check for duplicates in wait queue for symbols deps
Diffstat (limited to 'src/libserver/symbols_cache.c')
-rw-r--r--src/libserver/symbols_cache.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c
index 428d06b5f..6c0be35d4 100644
--- a/src/libserver/symbols_cache.c
+++ b/src/libserver/symbols_cache.c
@@ -1381,7 +1381,21 @@ rspamd_symbols_cache_check_deps (struct rspamd_task *task,
checkpoint,
recursion + 1,
check_only)) {
- g_ptr_array_add (checkpoint->waitq, item);
+ gboolean found = FALSE;
+ guint j;
+ struct cache_item *tmp_it;
+
+ PTR_ARRAY_FOREACH (checkpoint->waitq, j, tmp_it) {
+ if (item->id == tmp_it->id) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ g_ptr_array_add (checkpoint->waitq, item);
+ }
+
ret = FALSE;
msg_debug_task ("delayed dependency %d for symbol %d",
dep->id, item->id);
@@ -1686,10 +1700,25 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
if (!isset (checkpoint->processed_bits, item->id * 2)) {
if (!rspamd_symbols_cache_check_deps (task, cache, item,
checkpoint, 0, FALSE)) {
+ gboolean found = FALSE;
+ guint j;
+ struct cache_item *tmp_it;
+
msg_debug_task ("blocked execution of %d unless deps are "
- "resolved",
+ "resolved",
item->id);
- g_ptr_array_add (checkpoint->waitq, item);
+
+ PTR_ARRAY_FOREACH (checkpoint->waitq, j, tmp_it) {
+ if (item->id == tmp_it->id) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ g_ptr_array_add (checkpoint->waitq, item);
+ }
+
continue;
}