/* Sort items in logical order */ static void 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); for (j = 0; j < it->deps->len; j ++) { dep = g_ptr_array_index (it->deps, 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_id, 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; dep->id = dit->id; msg_debug ("add dependency from %d on %d", it->id, dit->id); } else { msg_err ("cannot find dependency on symbol %s", dep->sym); } } } }
/* Sort items in logical order */ static void rspamd_symbols_cache_post_init (struct symbols_cache *cache) { struct cache_item *it, *dit; struct cache_dependency *dep, *rdep; struct delayed_cache_dependency *ddep; struct delayed_cache_condition *dcond; GList *cur; guint i, j; gint id; rspamd_symbols_cache_resort (cache); cur = cache->delayed_deps; while (cur) { ddep = cur->data; id = rspamd_symbols_cache_find_symbol_parent (cache, ddep->from); if (id != -1) { it = g_ptr_array_index (cache->items_by_id, id); } else { it = NULL; } if (it == NULL) { msg_err_cache ("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); } cur = cache->delayed_conditions; while (cur) { dcond = cur->data; id = rspamd_symbols_cache_find_symbol_parent (cache, dcond->sym); if (id != -1) { it = g_ptr_array_index (cache->items_by_id, id); } else { it = NULL; } if (it == NULL) { msg_err_cache ( "cannot register delayed condition for %s", dcond->sym); luaL_unref (dcond->L, LUA_REGISTRYINDEX, dcond->cbref); } else { rspamd_symbols_cache_add_condition (cache, it->id, dcond->L, dcond->cbref); } 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); for (j = 0; j < it->deps->len; j ++) { dep = g_ptr_array_index (it->deps, 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_id, 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; dep->id = dit->id; msg_debug_cache ("add dependency from %d on %d", it->id, dit->id); } else { msg_err_cache ("cannot find dependency on symbol %s", dep->sym); } } } }