diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-07-02 00:15:37 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-07-15 22:34:41 -0400 |
commit | 9ff48d0982fcb97923955685fe9fa4e0e67cb238 (patch) | |
tree | b26c25523cf45bfd1659565d2d902c24e8168724 /src/journal-remote/journal-remote-write.c | |
parent | a83f403760cb63b1bf7787e9ff325ffb6d891d39 (diff) |
journal-remote: rework fd and writer reference handling
Diffstat (limited to 'src/journal-remote/journal-remote-write.c')
-rw-r--r-- | src/journal-remote/journal-remote-write.c | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/src/journal-remote/journal-remote-write.c b/src/journal-remote/journal-remote-write.c index 3b00ff5200..cdd06f9eff 100644 --- a/src/journal-remote/journal-remote-write.c +++ b/src/journal-remote/journal-remote-write.c @@ -19,6 +19,7 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ +#include "journal-remote.h" #include "journal-remote-write.h" int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) { @@ -64,32 +65,67 @@ static int do_rotate(JournalFile **f, bool compress, bool seal) { return r; } -int writer_init(Writer *s) { - assert(s); +Writer* writer_new(RemoteServer *server) { + Writer *w; - s->journal = NULL; + w = new0(Writer, 1); + if (!w) + return NULL; - memset(&s->metrics, 0xFF, sizeof(s->metrics)); + memset(&w->metrics, 0xFF, sizeof(w->metrics)); - s->mmap = mmap_cache_new(); - if (!s->mmap) - return log_oom(); + w->mmap = mmap_cache_new(); + if (!w->mmap) { + free(w); + return NULL; + } - s->seqnum = 0; + w->n_ref = 1; + w->server = server; - return 0; + return w; } -int writer_close(Writer *s) { - if (s->journal) { - journal_file_close(s->journal); - log_debug("Journal has been closed."); +Writer* writer_free(Writer *w) { + if (!w) + return NULL; + + if (w->journal) { + log_debug("Closing journal file %s.", w->journal->path); + journal_file_close(w->journal); } - if (s->mmap) - mmap_cache_unref(s->mmap); - return 0; + + if (w->server) { + w->server->event_count += w->seqnum; + if (w->hashmap_key) + hashmap_remove(w->server->writers, w->hashmap_key); + } + + free(w->hashmap_key); + + if (w->mmap) + mmap_cache_unref(w->mmap); + + free(w); + + return NULL; +} + +Writer* writer_unref(Writer *w) { + if (w && (-- w->n_ref <= 0)) + writer_free(w); + + return NULL; } +Writer* writer_ref(Writer *w) { + if (w) + assert_se(++ w->n_ref >= 2); + + return w; +} + + int writer_write(Writer *s, struct iovec_wrapper *iovw, dual_timestamp *ts, |