lua_gettable (L, -2);
if (lua_isfunction (L, -1)) {
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg,
+ NULL);
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
return 0;
}
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg, NULL);
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
return 0;
}
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg, NULL);
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
return 0;
}
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg, NULL);
task->ev_base = session->ctx->ev_base;
task->resolver = ctx->resolver;
rspamd_mempool_stat (&mem_st);
memcpy (&stat_copy, session->ctx->worker->srv->stat, sizeof (stat_copy));
stat = &stat_copy;
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg, NULL);
ctx = session->ctx;
task->resolver = ctx->resolver;
return 0;
}
- task = rspamd_task_new (session->ctx->worker, session->cfg);
+ task = rspamd_task_new (session->ctx->worker, session->cfg, NULL);
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
* Create new task
*/
struct rspamd_task *
-rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg)
+rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg,
+ rspamd_mempool_t *pool)
{
struct rspamd_task *new_task;
new_task->time_real = rspamd_get_ticks ();
new_task->time_virtual = rspamd_get_virtual_ticks ();
- new_task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "task");
+ if (pool == NULL) {
+ new_task->task_pool =
+ rspamd_mempool_new (rspamd_mempool_suggest_size (), "task");
+ new_task->flags |= RSPAMD_TASK_FLAG_OWN_POOL;
+ }
+ else {
+ new_task->task_pool = pool;
+ }
new_task->raw_headers = g_hash_table_new_full (rspamd_strcase_hash,
rspamd_strcase_equal, NULL, rspamd_ptr_array_free_hard);
REF_RELEASE (task->cfg);
}
- rspamd_mempool_delete (task->task_pool);
+ if (task->flags & RSPAMD_TASK_FLAG_OWN_POOL) {
+ rspamd_mempool_delete (task->task_pool);
+ }
+
g_slice_free1 (sizeof (struct rspamd_task), task);
}
}
#define RSPAMD_TASK_FLAG_COMPRESSED (1 << 24)
#define RSPAMD_TASK_FLAG_PROFILE (1 << 25)
#define RSPAMD_TASK_FLAG_GREYLISTED (1 << 26)
+#define RSPAMD_TASK_FLAG_OWN_POOL (1 << 27)
#define RSPAMD_TASK_IS_SKIPPED(task) (((task)->flags & RSPAMD_TASK_FLAG_SKIP))
#define RSPAMD_TASK_IS_JSON(task) (((task)->flags & RSPAMD_TASK_FLAG_JSON))
/**
* Construct new task for worker
*/
-struct rspamd_task * rspamd_task_new (struct rspamd_worker *worker,
- struct rspamd_config *cfg);
+struct rspamd_task *rspamd_task_new (struct rspamd_worker *worker,
+ struct rspamd_config *cfg,
+ rspamd_mempool_t *pool);
/**
* Destroy task object and remove its IO dispatcher if it exists
*/
if (cfg != NULL && message != NULL) {
base = event_init ();
rspamd_init_filters (cfg, FALSE, NULL);
- task = rspamd_task_new (NULL, cfg);
+ task = rspamd_task_new (NULL, cfg, NULL);
task->ev_base = base;
task->msg.begin = rspamd_mempool_alloc (task->task_pool, mlen);
rspamd_strlcpy ((gpointer)task->msg.begin, message, mlen);
gint r, *saved, rules = 0, err_idx;
/* Prepare task */
- task = rspamd_task_new (session->wrk, session->cfg);
+ task = rspamd_task_new (session->wrk, session->cfg, NULL);
task->cfg = ctx->cfg;
task->ev_base = conn_ent->rt->ev_base;
saved = rspamd_mempool_alloc0 (session->pool, sizeof (gint));
rspamd_printf ("cannot open %s: %s\n", argv[i], strerror (errno));
}
else {
- task = rspamd_task_new (NULL, NULL);
+ task = rspamd_task_new (NULL, NULL, NULL);
if (!rspamd_task_load_message (task, NULL, map, len)) {
rspamd_printf ("cannot load %s\n", argv[i]);
gsize len;
msg = session->client_message;
- task = rspamd_task_new (session->worker, session->ctx->cfg);
+ task = rspamd_task_new (session->worker, session->ctx->cfg, NULL);
task->flags |= RSPAMD_TASK_FLAG_MIME;
task->sock = -1;
if (cfg->finish_callbacks) {
ctx = worker->ctx;
/* Create a fake task object for async events */
- task = rspamd_task_new (worker, cfg);
+ task = rspamd_task_new (worker, cfg, NULL);
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
task->flags |= RSPAMD_TASK_FLAG_PROCESSING;
return;
}
- task = rspamd_task_new (worker, ctx->cfg);
+ task = rspamd_task_new (worker, ctx->cfg, NULL);
msg_info_task ("accepted connection from %s port %d, task ptr: %p",
rspamd_inet_address_to_string (addr),