reftable/reader: set up the reader when initializing table iterator

All the seeking functions accept a `struct reftable_reader` as input such that they can use the reader to look up the respective blocks. Refactor the code to instead set up the reader as a member of `struct table_iter` during initialization such that we don't have to pass the reader on every single call. This step is required to move seeking of records into the generic `struct reftable_iterator` infrastructure. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed May 13, 2024 at 10:47 UTC c82692f75591b320fbe5f4d2018505bd902f95e6
1 file changed +22 -17
reftable/reader.c
+22 -17
@@ -224,8 +224,14 @@ struct table_iter {
224 struct block_iter bi;
225 int is_finished;
226 };
227 -#define TABLE_ITER_INIT { \
228 - .bi = BLOCK_ITER_INIT \
227 +
228 +static int table_iter_init(struct table_iter *ti, struct reftable_reader *r)
229 +{
230 + struct block_iter bi = BLOCK_ITER_INIT;
231 + memset(ti, 0, sizeof(*ti));
232 + ti->r = r;
233 + ti->bi = bi;
234 + return 0;
235 }
236
237 static int table_iter_next_in_block(struct table_iter *ti,
@@ -386,26 +392,23 @@ static void iterator_from_table_iter(struct reftable_iterator *it,
392 it->ops = &table_iter_vtable;
393 }
394
389 -static int table_iter_seek_to(struct table_iter *ti, struct reftable_reader *r,
390 - uint64_t off, uint8_t typ)
395 +static int table_iter_seek_to(struct table_iter *ti, uint64_t off, uint8_t typ)
396 {
397 int err;
398
394 - err = reader_init_block_reader(r, &ti->br, off, typ);
399 + err = reader_init_block_reader(ti->r, &ti->br, off, typ);
400 if (err != 0)
401 return err;
402
398 - ti->r = r;
403 ti->typ = block_reader_type(&ti->br);
404 ti->block_off = off;
405 block_iter_seek_start(&ti->bi, &ti->br);
406 return 0;
407 }
408
405 -static int table_iter_seek_start(struct table_iter *ti, struct reftable_reader *r,
406 - uint8_t typ, int index)
409 +static int table_iter_seek_start(struct table_iter *ti, uint8_t typ, int index)
410 {
408 - struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
411 + struct reftable_reader_offsets *offs = reader_offsets_for(ti->r, typ);
412 uint64_t off = offs->offset;
413 if (index) {
414 off = offs->index_offset;
@@ -415,7 +418,7 @@ static int table_iter_seek_start(struct table_iter *ti, struct reftable_reader *
418 typ = BLOCK_TYPE_INDEX;
419 }
420
418 - return table_iter_seek_to(ti, r, off, typ);
421 + return table_iter_seek_to(ti, off, typ);
422 }
423
424 static int table_iter_seek_linear(struct table_iter *ti,
@@ -548,7 +551,7 @@ static int table_iter_seek_indexed(struct table_iter *ti,
551 if (err != 0)
552 goto done;
553
551 - err = table_iter_seek_to(ti, ti->r, index_result.u.idx.offset, 0);
554 + err = table_iter_seek_to(ti, index_result.u.idx.offset, 0);
555 if (err != 0)
556 goto done;
557
@@ -578,7 +581,7 @@ static int reader_seek(struct reftable_reader *r, struct reftable_iterator *it,
581 {
582 uint8_t typ = reftable_record_type(rec);
583 struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
581 - struct table_iter ti = TABLE_ITER_INIT, *p;
584 + struct table_iter ti, *p;
585 int err;
586
587 if (!offs->is_present) {
@@ -586,7 +589,9 @@ static int reader_seek(struct reftable_reader *r, struct reftable_iterator *it,
589 return 0;
590 }
591
589 - err = table_iter_seek_start(&ti, r, reftable_record_type(rec),
592 + table_iter_init(&ti, r);
593 +
594 + err = table_iter_seek_start(&ti, reftable_record_type(rec),
595 !!offs->index_offset);
596 if (err < 0)
597 goto out;
@@ -722,15 +727,15 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
727 struct reftable_iterator *it,
728 uint8_t *oid)
729 {
725 - struct table_iter ti_empty = TABLE_ITER_INIT;
726 - struct table_iter *ti = reftable_calloc(1, sizeof(*ti));
730 + struct table_iter *ti;
731 struct filtering_ref_iterator *filter = NULL;
732 struct filtering_ref_iterator empty = FILTERING_REF_ITERATOR_INIT;
733 int oid_len = hash_size(r->hash_id);
734 int err;
735
732 - *ti = ti_empty;
733 - err = table_iter_seek_start(ti, r, BLOCK_TYPE_REF, 0);
736 + REFTABLE_ALLOC_ARRAY(ti, 1);
737 + table_iter_init(ti, r);
738 + err = table_iter_seek_start(ti, BLOCK_TYPE_REF, 0);
739 if (err < 0) {
740 reftable_free(ti);
741 return err;