diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-10-15 02:53:04 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-10-15 02:53:04 +0200 |
commit | 8f9b6cd9eb049b00b1e9e669d0e35aa415dc8fb0 (patch) | |
tree | 69090523a2c37c636ff60c07b09d5c3c74b8ab28 /src | |
parent | 8725d60ae4f7a8471aa8a0207fa105e335d069a6 (diff) |
journal: automaticall reset location when the set of matches changes
Diffstat (limited to 'src')
-rw-r--r-- | src/journal/sd-journal.c | 40 | ||||
-rw-r--r-- | src/journal/sd-journal.h | 2 |
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 { |