aboutsummaryrefslogtreecommitdiffstats
path: root/src/worker.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-06-07 19:06:09 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-06-07 19:06:09 +0400
commit73ded9877fc31f8c1ff5818b643edb7d7c4ea788 (patch)
tree97a94ceb14fb963a61d414f3d20d44541a533fdb /src/worker.c
parenta44b10c0a88a70921f1eec9ced4b3ef0f0e01b4e (diff)
downloadrspamd-73ded9877fc31f8c1ff5818b643edb7d7c4ea788.tar.gz
rspamd-73ded9877fc31f8c1ff5818b643edb7d7c4ea788.zip
Avoid using global 'counters' hash, include it in struct rspamd_main.
Move worker related utils to separate file and include it in rspamd-mime library. Add some cross-dependencies.
Diffstat (limited to 'src/worker.c')
-rw-r--r--src/worker.c187
1 files changed, 0 insertions, 187 deletions
diff --git a/src/worker.c b/src/worker.c
index 1da4458d7..465104b6e 100644
--- a/src/worker.c
+++ b/src/worker.c
@@ -115,8 +115,6 @@ static gboolean write_socket (void *arg);
static sig_atomic_t wanna_die = 0;
-rspamd_hash_t *counters = NULL;
-
#ifndef HAVE_SA_SIGINFO
static void
sig_handler (gint signo)
@@ -179,191 +177,6 @@ sigusr1_handler (gint fd, short what, void *arg)
return;
}
-/*
- * Destructor for recipients list in a task
- */
-static void
-rcpt_destruct (void *pointer)
-{
- struct worker_task *task = (struct worker_task *) pointer;
-
- if (task->rcpt) {
- g_list_free (task->rcpt);
- }
-}
-
-/*
- * Create new task
- */
-struct worker_task *
-construct_task (struct rspamd_worker *worker)
-{
- struct worker_task *new_task;
-
- new_task = g_slice_alloc0 (sizeof (struct worker_task));
-
- new_task->worker = worker;
- new_task->state = READ_COMMAND;
- new_task->cfg = worker->srv->cfg;
- new_task->view_checked = FALSE;
-#ifdef HAVE_CLOCK_GETTIME
-# ifdef HAVE_CLOCK_PROCESS_CPUTIME_ID
- clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &new_task->ts);
-# elif defined(HAVE_CLOCK_VIRTUAL)
- clock_gettime (CLOCK_VIRTUAL, &new_task->ts);
-# else
- clock_gettime (CLOCK_REALTIME, &new_task->ts);
-# endif
-#endif
- if (gettimeofday (&new_task->tv, NULL) == -1) {
- msg_warn ("gettimeofday failed: %s", strerror (errno));
- }
-
- new_task->task_pool = memory_pool_new (memory_pool_get_size ());
-
- /* Add destructor for recipients list (it would be better to use anonymous function here */
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) rcpt_destruct, new_task);
- new_task->results = g_hash_table_new (g_str_hash, g_str_equal);
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) g_hash_table_destroy,
- new_task->results);
- new_task->re_cache = g_hash_table_new (g_str_hash, g_str_equal);
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) g_hash_table_destroy,
- new_task->re_cache);
- new_task->raw_headers = g_hash_table_new (rspamd_strcase_hash, rspamd_strcase_equal);
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) g_hash_table_destroy,
- new_task->raw_headers);
- new_task->emails = g_tree_new (compare_email_func);
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) g_tree_destroy,
- new_task->emails);
- new_task->urls = g_tree_new (compare_url_func);
- memory_pool_add_destructor (new_task->task_pool,
- (pool_destruct_func) g_tree_destroy,
- new_task->urls);
- new_task->sock = -1;
- new_task->is_mime = TRUE;
- new_task->pre_result.action = METRIC_ACTION_NOACTION;
-
- return new_task;
-}
-
-/**
- * Return worker's control structure by its type
- * @param type
- * @return worker's control structure or NULL
- */
-worker_t*
-get_worker_by_type (GQuark type)
-{
- worker_t **cur;
-
- cur = &workers[0];
- while (*cur) {
- if (g_quark_from_string ((*cur)->name) == type) {
- return *cur;
- }
- cur ++;
- }
-
- return NULL;
-}
-
-
-/*
- * Free all structures of worker_task
- */
-void
-free_task (struct worker_task *task, gboolean is_soft)
-{
- GList *part;
- struct mime_part *p;
-
- if (task) {
- debug_task ("free pointer %p", task);
- while ((part = g_list_first (task->parts))) {
- task->parts = g_list_remove_link (task->parts, part);
- p = (struct mime_part *) part->data;
- g_byte_array_free (p->content, TRUE);
- g_list_free_1 (part);
- }
- if (task->text_parts) {
- g_list_free (task->text_parts);
- }
- if (task->images) {
- g_list_free (task->images);
- }
- if (task->messages) {
- g_list_free (task->messages);
- }
- if (task->received) {
- g_list_free (task->received);
- }
- memory_pool_delete (task->task_pool);
- if (task->dispatcher) {
- if (is_soft) {
- /* Plan dispatcher shutdown */
- task->dispatcher->wanna_die = 1;
- }
- else {
- rspamd_remove_dispatcher (task->dispatcher);
- }
- }
- if (task->sock != -1) {
- close (task->sock);
- }
- g_slice_free1 (sizeof (struct worker_task), task);
- }
-}
-
-void
-free_task_hard (gpointer ud)
-{
- struct worker_task *task = ud;
-
- free_task (task, FALSE);
-}
-
-void
-free_task_soft (gpointer ud)
-{
- struct worker_task *task = ud;
-
- free_task (task, FALSE);
-}
-
-double
-set_counter (const gchar *name, guint32 value)
-{
- struct counter_data *cd;
- double alpha;
- gchar *key;
-
- cd = rspamd_hash_lookup (counters, (gpointer) name);
-
- if (cd == NULL) {
- cd = memory_pool_alloc_shared (counters->pool, sizeof (struct counter_data));
- cd->value = value;
- cd->number = 0;
- key = memory_pool_strdup_shared (counters->pool, name);
- rspamd_hash_insert (counters, (gpointer) key, (gpointer) cd);
- }
- else {
- /* Calculate new value */
- memory_pool_wlock_rwlock (counters->lock);
-
- alpha = 2. / (++cd->number + 1);
- cd->value = cd->value * (1. - alpha) + value * alpha;
-
- memory_pool_wunlock_rwlock (counters->lock);
- }
-
- return cd->value;
-}
-
#ifndef BUILD_STATIC
static void
fin_custom_filters (struct worker_task *task)