diff --git a/src/affile.c b/src/affile.c index 42f70c3..e8e2f1d 100644 --- a/src/affile.c +++ b/src/affile.c @@ -344,8 +344,12 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) { FDWrite *fdw; - self->writer = log_writer_new(LW_FORMAT_FILE, s, &self->owner->writer_options); + if (!self->writer) + { + self->writer = log_writer_new(LW_FORMAT_FILE, s, &self->owner->writer_options); + log_pipe_append(&self->super, self->writer); + } if (!log_pipe_init(self->writer, NULL, NULL)) { msg_error("Error initializing log writer", NULL); @@ -358,7 +362,6 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) if (self->owner->flags & AFFILE_FSYNC) fdw->fsync = TRUE; log_writer_reopen(self->writer, fdw); - log_pipe_append(&self->super, self->writer); } else { @@ -379,9 +382,7 @@ affile_dw_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) if (self->writer) { log_pipe_deinit(self->writer, NULL, NULL); - log_pipe_unref(self->writer); } - self->writer = NULL; return TRUE; } @@ -410,7 +411,7 @@ affile_dw_set_owner(AFFileDestWriter *self, AFFileDestDriver *owner) log_pipe_ref(&owner->super.super); self->owner = owner; if (self->writer) - log_writer_set_options((LogWriter *) self->writer, &owner->writer_options); + log_writer_set_options((LogWriter *) self->writer, &self->super, &owner->writer_options); } @@ -419,6 +420,8 @@ affile_dw_free(LogPipe *s) { AFFileDestWriter *self = (AFFileDestWriter *) s; + log_pipe_unref(self->writer); + self->writer = NULL; g_string_free(self->filename, TRUE); log_pipe_unref(&self->owner->super.super); @@ -620,6 +623,7 @@ affile_dd_reuse_writer(gpointer key, gpointer value, gpointer user_data) AFFileDestWriter *writer = (AFFileDestWriter *) value; affile_dw_set_owner(writer, self); + log_pipe_init(&writer->super, NULL, NULL); } @@ -665,7 +669,10 @@ affile_dd_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) { self->writer = persist_config_fetch(persist, affile_dd_format_persist_name(self)); if (self->writer) - affile_dw_set_owner(self->writer, self); + { + affile_dw_set_owner(self->writer, self); + log_pipe_init(&self->writer->super, NULL, NULL); + } } @@ -711,6 +718,12 @@ affile_dd_destroy_writer_hash(gpointer value) g_hash_table_destroy(writer_hash); } +static void +affile_dd_deinit_writer(gpointer key, gpointer value, gpointer user_data) +{ + log_pipe_deinit((LogPipe *) value, NULL, NULL); +} + static gboolean affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) { @@ -721,6 +734,7 @@ affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) { g_assert(self->writer_hash == NULL); + log_pipe_deinit(&self->writer->super, NULL, NULL); persist_config_add(persist, affile_dd_format_persist_name(self), self->writer, affile_dd_destroy_writer); self->writer = NULL; } @@ -728,6 +742,7 @@ affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) { g_assert(self->writer == NULL); + g_hash_table_foreach(self->writer_hash, affile_dd_deinit_writer, NULL); persist_config_add(persist, affile_dd_format_persist_name(self), self->writer_hash, affile_dd_destroy_writer_hash); self->writer_hash = NULL; } diff --git a/src/logwriter.c b/src/logwriter.c index 3286da7..bb82b43 100644 --- a/src/logwriter.c +++ b/src/logwriter.c @@ -423,6 +423,7 @@ log_writer_reopen(LogPipe *s, FDWrite *newfd) { LogWriter *self = (LogWriter *) s; + /* old fd is freed by the source */ if (self->source) { g_source_destroy(self->source); @@ -440,12 +441,12 @@ log_writer_reopen(LogPipe *s, FDWrite *newfd) } void -log_writer_set_options(LogWriter *self, LogWriterOptions *options) +log_writer_set_options(LogWriter *self, LogPipe *control, LogWriterOptions *options) { + self->control = control; self->options = options; } - LogPipe * log_writer_new(guint32 flags, LogPipe *control, LogWriterOptions *options) { diff --git a/src/logwriter.h b/src/logwriter.h index 3fe7129..284899b 100644 --- a/src/logwriter.h +++ b/src/logwriter.h @@ -81,7 +81,7 @@ typedef struct _LogWriter LogWriterOptions *options; } LogWriter; -void log_writer_set_options(LogWriter *self, LogWriterOptions *options); +void log_writer_set_options(LogWriter *self, LogPipe *control, LogWriterOptions *options); void log_writer_format_log(LogWriter *self, LogMessage *lm, GString *result); gboolean log_writer_reopen(LogPipe *s, FDWrite *fd); LogPipe *log_writer_new(guint32 flags, LogPipe *control, LogWriterOptions *options);