}
session->flags |= RSPAMD_SESSION_FLAG_DESTROYING;
- g_hash_table_foreach_remove (session->events,
- rspamd_session_destroy_callback,
- session);
+ rspamd_session_cleanup (session);
if (session->cleanup != NULL) {
session->cleanup (session->user_data);
return TRUE;
}
+void
+rspamd_session_cleanup (struct rspamd_async_session *session)
+{
+ if (session == NULL) {
+ msg_info_session ("session is NULL");
+ return;
+ }
+
+ g_hash_table_foreach_remove (session->events,
+ rspamd_session_destroy_callback,
+ session);
+}
+
gboolean
rspamd_session_pending (struct rspamd_async_session *session)
{
*/
gboolean rspamd_session_destroy (struct rspamd_async_session *session);
+/**
+ * Try to remove all events pending
+ */
+void rspamd_session_cleanup (struct rspamd_async_session *session);
+
/**
* Check session for events pending and call fin callback if no events are pending
* @param session session object
if (!(task->processed_stages & RSPAMD_TASK_STAGE_FILTERS)) {
msg_info_task ("processing of task timed out, forced processing");
task->processed_stages |= RSPAMD_TASK_STAGE_FILTERS;
+ rspamd_session_cleanup (task->s);
rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL);
+ rspamd_session_pending (task->s);
}
}