const gchar *line;
glong r;
gint fd;
+ gboolean locked = FALSE;
+
+ iov = (struct iovec *) data;
if (rspamd_log->type == RSPAMD_LOG_CONSOLE) {
}
if (!rspamd_log->no_lock) {
-#ifndef DISABLE_PTHREAD_MUTEX
- if (rspamd_log->mtx) {
- rspamd_mempool_lock_mutex (rspamd_log->mtx);
+ gsize tlen;
+
+ if (is_iov) {
+ tlen = 0;
+
+ for (guint i = 0; i < count; i ++) {
+ tlen += iov[i].iov_len;
+ }
}
else {
- rspamd_file_lock (fd, FALSE);
+ tlen = count;
}
+
+ if (tlen > PIPE_BUF) {
+ locked = TRUE;
+
+#ifndef DISABLE_PTHREAD_MUTEX
+ if (rspamd_log->mtx) {
+ rspamd_mempool_lock_mutex (rspamd_log->mtx);
+ }
+ else {
+ rspamd_file_lock (fd, FALSE);
+ }
#else
- rspamd_file_lock (fd, FALSE);
+ rspamd_file_lock (fd, FALSE);
#endif
+ }
}
if (is_iov) {
- iov = (struct iovec *) data;
r = writev (fd, iov, count);
}
else {
r = write (fd, line, count);
}
- if (!rspamd_log->no_lock) {
+ if (locked) {
#ifndef DISABLE_PTHREAD_MUTEX
if (rspamd_log->mtx) {
rspamd_mempool_unlock_mutex (rspamd_log->mtx);
#ifdef HAVE_SYSLOG_H
openlog ("rspamd", LOG_NDELAY | LOG_PID,
rspamd_log->log_facility);
+ rspamd_log->no_lock = TRUE;
#endif
break;
case RSPAMD_LOG_FILE:
if (rspamd_log->fd == -1) {
return -1;
}
+
+ rspamd_log->no_lock = TRUE;
break;
default:
return -1;
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;
- }
-}
-
static gint
rspamd_log_errlog_cmp (const ucl_object_t **o1, const ucl_object_t **o2)
{
*/
void rspamd_log_nodebug (rspamd_logger_t *logger);
-/**
- * Turn off locking on logger (useful to avoid races)
- */
-void rspamd_log_nolock (rspamd_logger_t *logger);
-
-/**
- * Turn on locking to avoid log output mix
- */
-void rspamd_log_lock (rspamd_logger_t *logger);
-
/**
* Return array of counters (4 numbers):
* 0 - errors
if (!rspamd_main->wanna_die) {
rspamd_main->wanna_die = TRUE;
msg_info_main ("catch termination signal, waiting for children");
- rspamd_log_nolock (rspamd_main->logger);
/* Stop srv events to avoid false notifications */
g_hash_table_foreach (rspamd_main->workers, stop_srv_ev, rspamd_main);
rspamd_pass_signal (rspamd_main->workers, SIGTERM);
/* Turn off locking for logger */
ev_child_stop (EV_A_ w);
- rspamd_log_nolock (rspamd_main->logger);
/* Remove dead child form children list */
g_hash_table_remove (rspamd_main->workers, GSIZE_TO_POINTER (wrk->pid));
wrk->pid);
rspamd_check_core_limits (rspamd_main);
rspamd_fork_delayed (wrk->cf, wrk->index, rspamd_main);
- rspamd_log_lock (rspamd_main->logger);
}
else {
msg_info_main ("do not respawn process %s after found terminated process with pid %P",