]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Allow registering of delayed dependencies.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 4 Jul 2015 21:33:33 +0000 (22:33 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 4 Jul 2015 21:33:33 +0000 (22:33 +0100)
src/libserver/symbols_cache.c
src/libserver/symbols_cache.h

index 2515b3213ffd8a9c4365d2350ee6df493323275d..7cab710f5e3af3ba1220f8d8abc9614fbb802d62 100644 (file)
@@ -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);
+}
index bf60e9aba8498d32368d5cf537fff91c4b4605be..7dd33ad8f6a46383c9e269368d5250bc42641b62 100644 (file)
@@ -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