From: Vsevolod Stakhov Date: Sat, 4 Jul 2015 21:33:33 +0000 (+0100) Subject: Allow registering of delayed dependencies. X-Git-Tag: 1.0.0~444 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0501a91169eda7336c70eac2855ae4cdd4c0fe42;p=thirdparty%2Frspamd.git Allow registering of delayed dependencies. --- diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c index 2515b3213f..7cab710f5e 100644 --- a/src/libserver/symbols_cache.c +++ b/src/libserver/symbols_cache.c @@ -43,6 +43,7 @@ struct symbols_cache { GHashTable *items_by_symbol; GPtrArray *items_by_order; GPtrArray *items_by_id; + GList *delayed_deps; rspamd_mempool_t *static_pool; gdouble max_weight; guint used_items; @@ -92,6 +93,11 @@ struct cache_dependency { gint id; }; +struct delayed_cache_dependency { + gchar *from; + gchar *to; +}; + struct cache_savepoint { guchar *processed_bits; guint pass; @@ -189,10 +195,29 @@ post_cache_init (struct symbols_cache *cache) { struct cache_item *it, *dit; struct cache_dependency *dep, *rdep; + struct delayed_cache_dependency *ddep; + GList *cur; guint i, j; g_ptr_array_sort_with_data (cache->items_by_order, cache_logic_cmp, cache); + cur = cache->delayed_deps; + while (cur) { + ddep = cur->data; + + it = g_hash_table_lookup (cache->items_by_symbol, ddep->from); + + if (it == NULL) { + msg_err ("cannot register delayed dependency between %s and %s, " + "%s is missing", ddep->from, ddep->to, ddep->from); + } + else { + rspamd_symbols_cache_add_dependency (cache, it->id, ddep->to); + } + + cur = g_list_next (cur); + } + for (i = 0; i < cache->items_by_id->len; i ++) { it = g_ptr_array_index (cache->items_by_id, i); @@ -560,6 +585,9 @@ rspamd_symbols_cache_add_symbol_callback_prio (struct symbols_cache *cache, void rspamd_symbols_cache_destroy (struct symbols_cache *cache) { + GList *cur; + struct delayed_cache_dependency *ddep; + if (cache != NULL) { if (cache->cfg->cache_filename) { @@ -571,6 +599,20 @@ rspamd_symbols_cache_destroy (struct symbols_cache *cache) } } + if (cache->delayed_deps) { + cur = cache->delayed_deps; + + while (cur) { + ddep = cur->data; + g_free (ddep->from); + g_free (ddep->to); + g_slice_free1 (sizeof (*ddep), ddep); + cur = g_list_next (cur); + } + + g_list_free (cache->delayed_deps); + } + g_hash_table_destroy (cache->items_by_symbol); rspamd_mempool_delete (cache->static_pool); g_ptr_array_free (cache->items_by_id, TRUE); @@ -1252,3 +1294,19 @@ rspamd_symbols_cache_add_dependency (struct symbols_cache *cache, dep->item = NULL; g_ptr_array_add (source->deps, dep); } + +void +rspamd_symbols_cache_add_delayed_dependency (struct symbols_cache *cache, + const gchar *from, const gchar *to) +{ + struct delayed_cache_dependency *ddep; + + g_assert (from != NULL); + g_assert (to != NULL); + + ddep = g_slice_alloc (sizeof (*ddep)); + ddep->from = g_strdup (from); + ddep->to = g_strdup (to); + + cache->delayed_deps = g_list_prepend (cache->delayed_deps, ddep); +} diff --git a/src/libserver/symbols_cache.h b/src/libserver/symbols_cache.h index bf60e9aba8..7dd33ad8f6 100644 --- a/src/libserver/symbols_cache.h +++ b/src/libserver/symbols_cache.h @@ -182,4 +182,13 @@ void rspamd_symbols_cache_inc_frequency (struct symbols_cache *cache, void rspamd_symbols_cache_add_dependency (struct symbols_cache *cache, gint id_from, const gchar *to); +/** + * Add delayed dependency that is resolved on cache post-load routine + * @param cache + * @param from + * @param to + */ +void rspamd_symbols_cache_add_delayed_dependency (struct symbols_cache *cache, + const gchar *from, const gchar *to); + #endif