aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libserver/symbols_cache.c39
-rw-r--r--src/libserver/symbols_cache.h10
-rw-r--r--src/libserver/worker_util.c33
-rw-r--r--src/libserver/worker_util.h5
4 files changed, 38 insertions, 49 deletions
diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c
index 823af39f5..01cb63cc0 100644
--- a/src/libserver/symbols_cache.c
+++ b/src/libserver/symbols_cache.c
@@ -83,6 +83,27 @@ cache_logic_cmp (const void *p1, const void *p2)
return (gint)w2 - w1;
}
+/**
+ * Set counter for a symbol
+ */
+static double
+rspamd_set_counter (struct cache_item *item, guint32 value)
+{
+ struct counter_data *cd;
+ double alpha;
+ cd = item->cd;
+
+ /* Calculate new value */
+ rspamd_mempool_lock_mutex (item->mtx);
+
+ alpha = 2. / (++cd->number + 1);
+ cd->value = cd->value * (1. - alpha) + value * alpha;
+
+ rspamd_mempool_unlock_mutex (item->mtx);
+
+ return cd->value;
+}
+
static GChecksum *
get_mem_cksum (struct symbols_cache *cache)
{
@@ -309,8 +330,13 @@ register_symbol_common (struct symbols_cache **cache,
item = rspamd_mempool_alloc0 (pcache->static_pool,
sizeof (struct cache_item));
item->s =
- rspamd_mempool_alloc0 (pcache->static_pool,
+ rspamd_mempool_alloc0_shared (pcache->static_pool,
sizeof (struct saved_cache_item));
+ item->cd = rspamd_mempool_alloc0_shared (pcache->static_pool,
+ sizeof (struct counter_data));
+
+ item->mtx = rspamd_mempool_get_mutex (pcache->static_pool);
+
rspamd_strlcpy (item->s->symbol, name, sizeof (item->s->symbol));
item->func = func;
item->user_data = user_data;
@@ -398,7 +424,7 @@ register_symbol_common (struct symbols_cache **cache,
pcache->used_items++;
g_hash_table_insert (pcache->items_by_symbol, item->s->symbol, item);
msg_debug ("used items: %d, added symbol: %s", (*cache)->used_items, name);
- rspamd_set_counter (item->s->symbol, 0);
+ rspamd_set_counter (item, 0);
*target = g_list_prepend (*target, item);
}
@@ -509,7 +535,7 @@ register_dynamic_symbol (rspamd_mempool_t *dynamic_pool,
pcache->used_items++;
msg_debug ("used items: %d, added symbol: %s", (*cache)->used_items, name);
- rspamd_set_counter (item->s->symbol, 0);
+ rspamd_set_counter (item, 0);
g_hash_table_insert (pcache->items_by_symbol, item->s->symbol, item);
@@ -677,9 +703,6 @@ init_symbols_cache (rspamd_mempool_t * pool,
return FALSE;
}
- /* Init locking */
- cache->lock = rspamd_mempool_get_rwlock (pool);
-
cache->cfg = cfg;
/* Just in-memory cache */
@@ -1006,11 +1029,9 @@ call_symbol_callback (struct rspamd_task * task,
}
if (cache->uses++ >= MAX_USES) {
msg_info ("resort symbols cache");
- rspamd_mempool_wlock_rwlock (cache->lock);
cache->uses = 0;
/* Resort while having write lock */
post_cache_init (cache);
- rspamd_mempool_wunlock_rwlock (cache->lock);
}
s =
rspamd_mempool_alloc0 (task->task_pool,
@@ -1203,7 +1224,7 @@ call_symbol_callback (struct rspamd_task * task,
diff =
(tv2.tv_sec - tv1.tv_sec) * 1000000 + (tv2.tv_usec - tv1.tv_usec);
#endif
- item->s->avg_time = rspamd_set_counter (item->s->symbol, diff);
+ item->s->avg_time = rspamd_set_counter (item, diff);
}
s->saved_item = item;
diff --git a/src/libserver/symbols_cache.h b/src/libserver/symbols_cache.h
index fd9da2ef7..676430913 100644
--- a/src/libserver/symbols_cache.h
+++ b/src/libserver/symbols_cache.h
@@ -24,9 +24,17 @@ struct dynamic_map_item {
gboolean negative;
};
+struct counter_data {
+ gdouble value;
+ gint number;
+};
+
struct cache_item {
/* Static item's data */
struct saved_cache_item *s;
+ struct counter_data *cd;
+
+ rspamd_mempool_mutex_t *mtx;
/* For dynamic rules */
struct dynamic_map_item *networks;
@@ -43,7 +51,6 @@ struct cache_item {
gboolean is_virtual;
gboolean is_callback;
-
/* Priority */
gint priority;
gdouble metric_weight;
@@ -78,7 +85,6 @@ struct symbols_cache {
guint used_items;
guint uses;
gpointer map;
- rspamd_mempool_rwlock_t *lock;
struct rspamd_config *cfg;
};
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c
index f2f04b397..20ef1fc15 100644
--- a/src/libserver/worker_util.c
+++ b/src/libserver/worker_util.c
@@ -48,39 +48,6 @@ rspamd_get_worker_by_type (GQuark type)
return NULL;
}
-
-double
-rspamd_set_counter (const gchar *name, guint32 value)
-{
- struct counter_data *cd;
- double alpha;
- gchar *key;
-
- cd = rspamd_hash_lookup (rspamd_main->counters, (gpointer) name);
-
- if (cd == NULL) {
- cd =
- rspamd_mempool_alloc_shared (rspamd_main->counters->pool,
- sizeof (struct counter_data));
- cd->value = value;
- cd->number = 0;
- key = rspamd_mempool_strdup_shared (rspamd_main->counters->pool, name);
- rspamd_hash_insert (rspamd_main->counters, (gpointer) key,
- (gpointer) cd);
- }
- else {
- /* Calculate new value */
- rspamd_mempool_wlock_rwlock (rspamd_main->counters->lock);
-
- alpha = 2. / (++cd->number + 1);
- cd->value = cd->value * (1. - alpha) + value * alpha;
-
- rspamd_mempool_wunlock_rwlock (rspamd_main->counters->lock);
- }
-
- return cd->value;
-}
-
sig_atomic_t wanna_die = 0;
#ifndef HAVE_SA_SIGINFO
diff --git a/src/libserver/worker_util.h b/src/libserver/worker_util.h
index 54926e5f8..d1aa1e862 100644
--- a/src/libserver/worker_util.h
+++ b/src/libserver/worker_util.h
@@ -34,11 +34,6 @@
*/
worker_t * rspamd_get_worker_by_type (GQuark type);
-/**
- * Set counter for a symbol
- */
-double rspamd_set_counter (const gchar *name, guint32 value);
-
#ifndef HAVE_SA_SIGINFO
typedef void (*rspamd_sig_handler_t) (gint);
#else