summaryrefslogtreecommitdiff
path: root/src/journal-remote/journal-remote-write.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-07-02 00:15:37 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-07-15 22:34:41 -0400
commit9ff48d0982fcb97923955685fe9fa4e0e67cb238 (patch)
treeb26c25523cf45bfd1659565d2d902c24e8168724 /src/journal-remote/journal-remote-write.c
parenta83f403760cb63b1bf7787e9ff325ffb6d891d39 (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.c68
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,