summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libserver/symbols_cache.c100
-rw-r--r--src/libserver/symbols_cache.h11
2 files changed, 81 insertions, 30 deletions
diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c
index f7e4e5d7b..bde412461 100644
--- a/src/libserver/symbols_cache.c
+++ b/src/libserver/symbols_cache.c
@@ -148,7 +148,7 @@ rspamd_symbols_cache_load_items (struct symbols_cache *cache, const gchar *name)
ucl_object_t *top;
const ucl_object_t *cur, *elt;
ucl_object_iter_t it;
- struct cache_item *item;
+ struct cache_item *item, *parent;
const guchar *p;
gint fd;
gpointer map;
@@ -312,15 +312,26 @@ rspamd_symbols_cache_add_symbol (struct symbols_cache *cache,
gint priority,
symbol_func_t func,
gpointer user_data,
- enum rspamd_symbol_type type)
+ enum rspamd_symbol_type type,
+ gint parent)
{
struct cache_item *item = NULL;
g_assert (cache != NULL);
- if (g_hash_table_lookup (cache->items_by_symbol, name) != NULL) {
- msg_err ("skip duplicate symbol registration for %s", name);
- return -1;
+ if (name == NULL && type != SYMBOL_TYPE_CALLBACK) {
+ msg_warn ("no name for non-callback symbol!");
+ }
+ else if (type == SYMBOL_TYPE_VIRTUAL && parent == -1) {
+ msg_warn ("no parent symbol is associated with virtual symbol %s",
+ name);
+ }
+
+ if (name != NULL) {
+ if (g_hash_table_lookup (cache->items_by_symbol, name) != NULL) {
+ msg_err ("skip duplicate symbol registration for %s", name);
+ return -1;
+ }
}
item = rspamd_mempool_alloc0_shared (cache->static_pool,
@@ -332,7 +343,10 @@ rspamd_symbols_cache_add_symbol (struct symbols_cache *cache,
item->cd = rspamd_mempool_alloc0 (cache->static_pool,
sizeof (struct counter_data));
- item->symbol = rspamd_mempool_strdup (cache->static_pool, name);
+ if (name != NULL) {
+ item->symbol = rspamd_mempool_strdup (cache->static_pool, name);
+ }
+
item->func = func;
item->user_data = user_data;
item->priority = priority;
@@ -344,17 +358,22 @@ rspamd_symbols_cache_add_symbol (struct symbols_cache *cache,
}
item->id = cache->used_items;
+ item->parent = parent;
cache->used_items ++;
msg_debug ("used items: %d, added symbol: %s", cache->used_items, name);
rspamd_set_counter (item, 0);
- g_hash_table_insert (cache->items_by_symbol, item->symbol, item);
g_ptr_array_add (cache->items_by_order, item);
+ if (name != NULL) {
+ g_hash_table_insert (cache->items_by_symbol, item->symbol, item);
+ }
+
return item->id;
}
gint
-rspamd_symbols_cache_add_symbol_normal (struct symbols_cache *cache, const gchar *name, double weight,
+rspamd_symbols_cache_add_symbol_normal (struct symbols_cache *cache,
+ const gchar *name, double weight,
symbol_func_t func, gpointer user_data)
{
return rspamd_symbols_cache_add_symbol (cache,
@@ -363,13 +382,15 @@ rspamd_symbols_cache_add_symbol_normal (struct symbols_cache *cache, const gchar
0,
func,
user_data,
- SYMBOL_TYPE_NORMAL);
+ SYMBOL_TYPE_NORMAL,
+ -1);
}
gint
rspamd_symbols_cache_add_symbol_virtual (struct symbols_cache *cache,
const gchar *name,
- double weight)
+ double weight,
+ gint parent)
{
return rspamd_symbols_cache_add_symbol (cache,
name,
@@ -377,40 +398,41 @@ rspamd_symbols_cache_add_symbol_virtual (struct symbols_cache *cache,
0,
NULL,
NULL,
- SYMBOL_TYPE_VIRTUAL);
+ SYMBOL_TYPE_VIRTUAL,
+ parent);
}
gint
rspamd_symbols_cache_add_symbol_callback (struct symbols_cache *cache,
- const gchar *name,
double weight,
symbol_func_t func,
gpointer user_data)
{
return rspamd_symbols_cache_add_symbol (cache,
- name,
+ NULL,
weight,
0,
func,
user_data,
- SYMBOL_TYPE_CALLBACK);
+ SYMBOL_TYPE_CALLBACK,
+ -1);
}
gint
rspamd_symbols_cache_add_symbol_callback_prio (struct symbols_cache *cache,
- const gchar *name,
double weight,
gint priority,
symbol_func_t func,
gpointer user_data)
{
return rspamd_symbols_cache_add_symbol (cache,
- name,
+ NULL,
weight,
priority,
func,
user_data,
- SYMBOL_TYPE_CALLBACK);
+ SYMBOL_TYPE_CALLBACK,
+ -1);
}
void
@@ -638,7 +660,8 @@ rspamd_symbols_cache_process_symbol (struct rspamd_task * task,
if (item->type == SYMBOL_TYPE_NORMAL || item->type == SYMBOL_TYPE_CALLBACK) {
t1 = rspamd_get_ticks ();
- if (G_UNLIKELY (check_debug_symbol (task->cfg, item->symbol))) {
+ if (item->symbol != NULL &&
+ G_UNLIKELY (check_debug_symbol (task->cfg, item->symbol))) {
rspamd_log_debug (rspamd_main->logger);
item->func (task, item->user_data);
rspamd_log_nodebug (rspamd_main->logger);
@@ -659,22 +682,44 @@ rspamd_symbols_cache_process_symbol (struct rspamd_task * task,
return TRUE;
}
+struct counters_cbdata {
+ ucl_object_t *top;
+ struct symbols_cache *cache;
+};
+
static void
rspamd_symbols_cache_counters_cb (gpointer k, gpointer v, gpointer ud)
{
- ucl_object_t *obj, *top = ud;
- struct cache_item *item = v;
+ struct counters_cbdata *cbd = ud;
+ ucl_object_t *obj, *top;
+ struct cache_item *item = v, *parent;
+
+ top = cbd->top;
if (item->type != SYMBOL_TYPE_CALLBACK) {
obj = ucl_object_typed_new (UCL_OBJECT);
ucl_object_insert_key (obj, ucl_object_fromstring (item->symbol),
"symbol", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromdouble (item->weight),
- "weight", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromint (item->frequency),
- "frequency", 0, false);
- ucl_object_insert_key (obj, ucl_object_fromdouble (item->avg_time),
- "time", 0, false);
+
+ if (item->type == SYMBOL_TYPE_VIRTUAL && item->parent != -1) {
+ g_assert (item->parent < cbd->cache->items_by_order->len);
+ parent = g_ptr_array_index (cbd->cache->items_by_order,
+ item->parent);
+ ucl_object_insert_key (obj, ucl_object_fromdouble (item->weight),
+ "weight", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (item->frequency),
+ "frequency", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromdouble (parent->avg_time),
+ "time", 0, false);
+ }
+ else {
+ ucl_object_insert_key (obj, ucl_object_fromdouble (item->weight),
+ "weight", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromint (item->frequency),
+ "frequency", 0, false);
+ ucl_object_insert_key (obj, ucl_object_fromdouble (item->avg_time),
+ "time", 0, false);
+ }
ucl_array_append (top, obj);
}
@@ -684,9 +729,12 @@ ucl_object_t *
rspamd_symbols_cache_counters (struct symbols_cache * cache)
{
ucl_object_t *top;
+ struct counters_cbdata cbd;
g_assert (cache != NULL);
top = ucl_object_typed_new (UCL_ARRAY);
+ cbd.top = top;
+ cbd.cache = cache;
g_hash_table_foreach (cache->items_by_symbol,
rspamd_symbols_cache_counters_cb, top);
diff --git a/src/libserver/symbols_cache.h b/src/libserver/symbols_cache.h
index b3ebcc559..9c182db39 100644
--- a/src/libserver/symbols_cache.h
+++ b/src/libserver/symbols_cache.h
@@ -78,10 +78,13 @@ gint rspamd_symbols_cache_add_symbol_normal (struct symbols_cache *cache,
/**
* Register virtual symbol
* @param name name of symbol
+ * @param weight initial weight
+ * @param parent associated callback parent
*/
gint rspamd_symbols_cache_add_symbol_virtual (struct symbols_cache *cache,
const gchar *name,
- double weight);
+ double weight,
+ gint parent);
/**
* Register callback function for symbols parsing
@@ -90,7 +93,6 @@ gint rspamd_symbols_cache_add_symbol_virtual (struct symbols_cache *cache,
* @param user_data pointer to user_data
*/
gint rspamd_symbols_cache_add_symbol_callback (struct symbols_cache *cache,
- const gchar *name,
double weight,
symbol_func_t func,
gpointer user_data);
@@ -102,7 +104,6 @@ gint rspamd_symbols_cache_add_symbol_callback (struct symbols_cache *cache,
* @param user_data pointer to user_data
*/
gint rspamd_symbols_cache_add_symbol_callback_prio (struct symbols_cache *cache,
- const gchar *name,
double weight,
gint priority,
symbol_func_t func,
@@ -117,6 +118,7 @@ gint rspamd_symbols_cache_add_symbol_callback_prio (struct symbols_cache *cache,
* @param func
* @param user_data
* @param type
+ * @param parent
*/
gint rspamd_symbols_cache_add_symbol (struct symbols_cache *cache,
const gchar *name,
@@ -124,7 +126,8 @@ gint rspamd_symbols_cache_add_symbol (struct symbols_cache *cache,
gint priority,
symbol_func_t func,
gpointer user_data,
- enum rspamd_symbol_type type);
+ enum rspamd_symbol_type type,
+ gint parent);
/**
* Call function for cached symbol using saved callback