Skip to content

Commit c82692f

Browse files
pks-tgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f1e3c12 commit c82692f

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

reftable/reader.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,14 @@ struct table_iter {
224224
struct block_iter bi;
225225
int is_finished;
226226
};
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;
229235
}
230236

231237
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,
386392
it->ops = &table_iter_vtable;
387393
}
388394

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)
391396
{
392397
int err;
393398

394-
err = reader_init_block_reader(r, &ti->br, off, typ);
399+
err = reader_init_block_reader(ti->r, &ti->br, off, typ);
395400
if (err != 0)
396401
return err;
397402

398-
ti->r = r;
399403
ti->typ = block_reader_type(&ti->br);
400404
ti->block_off = off;
401405
block_iter_seek_start(&ti->bi, &ti->br);
402406
return 0;
403407
}
404408

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)
407410
{
408-
struct reftable_reader_offsets *offs = reader_offsets_for(r, typ);
411+
struct reftable_reader_offsets *offs = reader_offsets_for(ti->r, typ);
409412
uint64_t off = offs->offset;
410413
if (index) {
411414
off = offs->index_offset;
@@ -415,7 +418,7 @@ static int table_iter_seek_start(struct table_iter *ti, struct reftable_reader *
415418
typ = BLOCK_TYPE_INDEX;
416419
}
417420

418-
return table_iter_seek_to(ti, r, off, typ);
421+
return table_iter_seek_to(ti, off, typ);
419422
}
420423

421424
static int table_iter_seek_linear(struct table_iter *ti,
@@ -548,7 +551,7 @@ static int table_iter_seek_indexed(struct table_iter *ti,
548551
if (err != 0)
549552
goto done;
550553

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);
552555
if (err != 0)
553556
goto done;
554557

@@ -578,15 +581,17 @@ static int reader_seek(struct reftable_reader *r, struct reftable_iterator *it,
578581
{
579582
uint8_t typ = reftable_record_type(rec);
580583
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;
582585
int err;
583586

584587
if (!offs->is_present) {
585588
iterator_set_empty(it);
586589
return 0;
587590
}
588591

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),
590595
!!offs->index_offset);
591596
if (err < 0)
592597
goto out;
@@ -722,15 +727,15 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
722727
struct reftable_iterator *it,
723728
uint8_t *oid)
724729
{
725-
struct table_iter ti_empty = TABLE_ITER_INIT;
726-
struct table_iter *ti = reftable_calloc(1, sizeof(*ti));
730+
struct table_iter *ti;
727731
struct filtering_ref_iterator *filter = NULL;
728732
struct filtering_ref_iterator empty = FILTERING_REF_ITERATOR_INIT;
729733
int oid_len = hash_size(r->hash_id);
730734
int err;
731735

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);
734739
if (err < 0) {
735740
reftable_free(ti);
736741
return err;

0 commit comments

Comments
 (0)