gboolean enabled;
gboolean is_debug;
gboolean throttling;
+ gboolean no_lock;
time_t throttling_time;
sig_atomic_t do_reopen_log;
enum rspamd_log_type type;
static rspamd_logger_t *default_logger = NULL;
+#define RSPAMD_LOGGER_LOCK(l) do { \
+ if ((l) != NULL && !(l)->no_lock) { \
+ rspamd_mempool_lock_mutex ((l)->mtx); \
+ } \
+} while (0)
+
+#define RSPAMD_LOGGER_UNLOCK(l) do { \
+ if ((l) != NULL && !(l)->no_lock) { \
+ rspamd_mempool_unlock_mutex ((l)->mtx); \
+ } \
+} while (0)
+
static void
syslog_log_function (const gchar *log_domain, const gchar *module,
else {
if (rspamd_logger_need_log (rspamd_log, log_level, module)) {
rspamd_vsnprintf (logbuf, sizeof (logbuf), fmt, args);
- rspamd_mempool_lock_mutex (rspamd_log->mtx);
+ RSPAMD_LOGGER_LOCK (rspamd_log);
rspamd_log->log_func (NULL, module, id,
function,
log_level,
logbuf,
FALSE,
rspamd_log);
- rspamd_mempool_unlock_mutex (rspamd_log->mtx);
+ RSPAMD_LOGGER_UNLOCK (rspamd_log);
}
switch (log_level) {
return;
}
}
- rspamd_mempool_lock_mutex (rspamd_log->mtx);
+
+ RSPAMD_LOGGER_LOCK (rspamd_log);
va_start (vp, fmt);
end = rspamd_vsnprintf (logbuf, sizeof (logbuf), fmt, vp);
*end = '\0';
logbuf,
TRUE,
rspamd_log);
- rspamd_mempool_unlock_mutex (rspamd_log->mtx);
+ RSPAMD_LOGGER_UNLOCK (rspamd_log);
}
}
if (rspamd_log->enabled &&
rspamd_logger_need_log (rspamd_log, log_level, NULL)) {
- rspamd_mempool_lock_mutex (rspamd_log->mtx);
+ RSPAMD_LOGGER_LOCK (rspamd_log);
rspamd_log->log_func (log_domain, "glib", NULL,
NULL,
log_level,
message,
FALSE,
rspamd_log);
- rspamd_mempool_unlock_mutex (rspamd_log->mtx);
+ RSPAMD_LOGGER_UNLOCK (rspamd_log);
}
}
return NULL;
}
+
+void
+rspamd_log_nolock (rspamd_logger_t *logger)
+{
+ if (logger) {
+ logger->no_lock = TRUE;
+ }
+}
+
+void
+rspamd_log_lock (rspamd_logger_t *logger)
+{
+ if (logger) {
+ logger->no_lock = FALSE;
+ }
+}
struct rspamd_worker *cur;
pid_t wrk;
+ /* Turn off locking for logger */
+ rspamd_log_nolock (rspamd_main->logger);
+
msg_debug_main ("catch SIGCHLD signal, finding terminated worker");
/* Remove dead child form children list */
wrk = waitpid (0, &res, 0);
}
}
}
+
+ rspamd_log_lock (rspamd_main->logger);
}
static void