From 4d8b09e4b85611e5c5b44bee328084f825ba3a9c Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 20 Apr 2022 19:52:13 +0200 Subject: journal: Only move to object if requested --- src/libsystemd/sd-journal/sd-journal.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'src/libsystemd/sd-journal') diff --git a/src/libsystemd/sd-journal/sd-journal.c b/src/libsystemd/sd-journal/sd-journal.c index e8c66a5e2c..29e11c0d53 100644 --- a/src/libsystemd/sd-journal/sd-journal.c +++ b/src/libsystemd/sd-journal/sd-journal.c @@ -493,7 +493,6 @@ static int next_for_match( int r; uint64_t np = 0; - Object *n; assert(j); assert(m); @@ -569,12 +568,12 @@ static int next_for_match( assert(np > 0); - r = journal_file_move_to_object(f, OBJECT_ENTRY, np, &n); - if (r < 0) - return r; + if (ret) { + r = journal_file_move_to_object(f, OBJECT_ENTRY, np, ret); + if (r < 0) + return r; + } - if (ret) - *ret = n; if (offset) *offset = np; @@ -633,7 +632,6 @@ static int find_location_for_match( } else if (m->type == MATCH_OR_TERM) { uint64_t np = 0; - Object *n; /* Find the earliest match */ @@ -652,12 +650,12 @@ static int find_location_for_match( if (np == 0) return 0; - r = journal_file_move_to_object(f, OBJECT_ENTRY, np, &n); - if (r < 0) - return r; + if (ret) { + r = journal_file_move_to_object(f, OBJECT_ENTRY, np, ret); + if (r < 0) + return r; + } - if (ret) - *ret = n; if (offset) *offset = np; -- cgit v1.2.3 From 9a390e86b7b60676ac6ae78224fe65b5951c0836 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 20 Apr 2022 23:58:39 +0200 Subject: journal: Document generic_array_bisect() It's not trivial to figure out that this function does not search for an exact match for the given needle, but whichever object in the given direction that's closest to the needle. Let's add a documentation blurb to explain how the function works for to help future developers looking at this function. --- src/libsystemd/sd-journal/journal-file.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/libsystemd/sd-journal') diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 6ee5697bc9..ccf09596d4 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -2356,6 +2356,19 @@ static int generic_array_bisect( uint64_t *ret_offset, uint64_t *ret_idx) { + /* Given an entry array chain, this function finds the object "closest" to the given needle in the + * chain, taking into account the provided direction. A function can be provided to determine how + * an object is matched against the given needle. + * + * Given a journal file, the offset of an object and the needle, the test_object() function should + * return TEST_LEFT if the needle is located earlier in the entry array chain, TEST_RIGHT if the + * needle is located later in the entry array chain and TEST_FOUND if the object matches the needle. + * If test_object() returns TEST_FOUND for a specific object, that object's information will be used + * to populate the return values of this function. If test_object() never returns TEST_FOUND, the + * return values are populated with the details of one of the objects closest to the needle. If the + * direction is DIRECTION_UP, the earlier object is used. Otherwise, the later object is used. + */ + uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = UINT64_MAX; bool subtract_one = false; Object *array = NULL; -- cgit v1.2.3