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;
};
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
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);
}
}
}
+
+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);
+}
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