summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-10-15 02:53:04 +0200
committerLennart Poettering <lennart@poettering.net>2011-10-15 02:53:04 +0200
commit8f9b6cd9eb049b00b1e9e669d0e35aa415dc8fb0 (patch)
tree69090523a2c37c636ff60c07b09d5c3c74b8ab28
parent8725d60ae4f7a8471aa8a0207fa105e335d069a6 (diff)
journal: automaticall reset location when the set of matches changes
-rw-r--r--src/journal/sd-journal.c40
-rw-r--r--src/journal/sd-journal.h2
2 files changed, 26 insertions, 16 deletions
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
index 6a68275e9e..5d518a3870 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -50,6 +50,19 @@ struct sd_journal {
unsigned n_matches;
};
+static void reset_location(sd_journal *j) {
+ Iterator i;
+ JournalFile *f;
+
+ assert(j);
+
+ j->current_file = NULL;
+ j->current_field = 0;
+
+ HASHMAP_FOREACH(f, j->files, i)
+ f->current_offset = 0;
+}
+
int sd_journal_add_match(sd_journal *j, const void *data, size_t size) {
Match *m;
@@ -78,6 +91,8 @@ int sd_journal_add_match(sd_journal *j, const void *data, size_t size) {
LIST_PREPEND(Match, matches, j->matches, m);
j->n_matches ++;
+ reset_location(j);
+
return 0;
}
@@ -93,6 +108,8 @@ void sd_journal_flush_matches(sd_journal *j) {
}
j->n_matches = 0;
+
+ reset_location(j);
}
static int compare_order(JournalFile *af, Object *ao, uint64_t ap,
@@ -708,25 +725,18 @@ void sd_journal_start_data(sd_journal *j) {
j->current_field = 0;
}
-static int real_journal_seek_head(sd_journal *j, direction_t direction) {
- Iterator i;
- JournalFile *f;
-
+int sd_journal_seek_head(sd_journal *j) {
assert(j);
- j->current_file = NULL;
- j->current_field = 0;
-
- HASHMAP_FOREACH(f, j->files, i)
- f->current_offset = 0;
+ reset_location(j);
- return real_journal_next(j, direction);
-}
-
-int sd_journal_seek_head(sd_journal *j) {
- return real_journal_seek_head(j, DIRECTION_DOWN);
+ return real_journal_next(j, DIRECTION_DOWN);
}
int sd_journal_seek_tail(sd_journal *j) {
- return real_journal_seek_head(j, DIRECTION_UP);
+ assert(j);
+
+ reset_location(j);
+
+ return real_journal_next(j, DIRECTION_UP);
}
diff --git a/src/journal/sd-journal.h b/src/journal/sd-journal.h
index bf6673453d..9978ca9ac0 100644
--- a/src/journal/sd-journal.h
+++ b/src/journal/sd-journal.h
@@ -76,7 +76,7 @@ enum {
SD_JOURNAL_DROP
};
-int sd_journal_process(sd_journal *j);
+int sd_journal_process(sd_journal *j); /* missing */
#define SD_JOURNAL_FOREACH_BEGIN(j) \
if (sd_journal_seek_head(j) > 0) do {