From: Vsevolod Stakhov Date: Sun, 7 Jun 2015 12:57:23 +0000 (+0100) Subject: Implement dependencies addition. X-Git-Tag: 1.0.0~569 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=69d09c6c9c0b1b50be2c63d169d67df5621ad1bc;p=rspamd.git Implement dependencies addition. --- diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c index 8b5272620..32ed6f786 100644 --- a/src/libserver/symbols_cache.c +++ b/src/libserver/symbols_cache.c @@ -82,12 +82,13 @@ struct cache_item { gdouble metric_weight; /* Dependencies */ - GArray *deps; - GArray *rdeps; + GPtrArray *deps; + GPtrArray *rdeps; }; struct cache_dependency { - gchar *name; + struct cache_item *item; + gchar *sym; gint id; }; @@ -164,7 +165,36 @@ rspamd_set_counter (struct cache_item *item, guint32 value) static void post_cache_init (struct symbols_cache *cache) { + struct cache_item *it, *dit; + struct cache_dependency *dep, *rdep; + guint i, j; + g_ptr_array_sort_with_data (cache->items_by_order, cache_logic_cmp, cache); + + for (i = 0; i < cache->items_by_id->len; i ++) { + it = g_ptr_array_index (cache->items_by_id, i); + + for (j = 0; j < it->deps->len; j ++) { + dep = g_ptr_array_index (cache->items_by_id, j); + dit = g_hash_table_lookup (cache->items_by_symbol, dep->sym); + + if (dit != NULL) { + if (dit->parent != -1) { + dit = g_ptr_array_index (cache->items_by_order, dit->parent); + } + + rdep = rspamd_mempool_alloc (cache->static_pool, sizeof (*rdep)); + rdep->sym = dep->sym; + rdep->item = it; + rdep->id = i; + g_ptr_array_add (dit->rdeps, rdep); + dep->item = dit; + } + else { + msg_warn ("cannot find dependency on symbol %s", dep->sym); + } + } + } } static gboolean @@ -424,6 +454,12 @@ rspamd_symbols_cache_add_symbol (struct symbols_cache *cache, rspamd_set_counter (item, 0); g_ptr_array_add (cache->items_by_id, item); g_ptr_array_add (cache->items_by_order, item); + item->deps = g_ptr_array_new (); + item->rdeps = g_ptr_array_new (); + rspamd_mempool_add_destructor (cache->static_pool, + rspamd_ptr_array_free_hard, item->deps); + rspamd_mempool_add_destructor (cache->static_pool, + rspamd_ptr_array_free_hard, item->rdeps); if (name != NULL) { g_hash_table_insert (cache->items_by_symbol, item->symbol, item); @@ -960,3 +996,21 @@ 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) +{ + struct cache_item *source; + struct cache_dependency *dep; + + g_assert (id_from < (gint)cache->items_by_id->len); + + source = g_ptr_array_index (cache->items_by_id, id_from); + dep = rspamd_mempool_alloc (cache->static_pool, sizeof (*dep)); + dep->id = id_from; + dep->sym = rspamd_mempool_strdup (cache->static_pool, to); + /* Will be filled later */ + dep->item = NULL; + g_ptr_array_add (source->deps, dep); +} diff --git a/src/libserver/symbols_cache.h b/src/libserver/symbols_cache.h index 878d0a0bf..014a825dc 100644 --- a/src/libserver/symbols_cache.h +++ b/src/libserver/symbols_cache.h @@ -173,4 +173,14 @@ void rspamd_symbols_cache_start_refresh (struct symbols_cache * cache, void rspamd_symbols_cache_inc_frequency (struct symbols_cache *cache, const gchar *symbol); +/** + * Add dependency relation between two symbols identified by id (source) and + * a symbolic name (destination). Destination could be virtual or real symbol. + * Callback destinations are not yet supported. + * @param id_from source symbol + * @param to destination name + */ +void rspamd_symbols_cache_add_dependency (struct symbols_cache *cache, + gint id_from, const gchar *to); + #endif