reftable/blocksource: consolidate code into a single file
The code that implements block sources is distributed across a couple of files. Consolidate all of it into "reftable/blocksource.c" and its accompanying header so that it is easier to locate and more self contained. While at it, rename some of the functions to have properly scoped names. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Apr 7, 2025 at 15:16 UTC
1ac4e5e83d997887dcd051c89861292a45a3db8c
10 files changed
+80
-62
reftable/block.c
+3
-14
@@ -221,7 +221,7 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block,
221
uint32_t restart_start = 0;
222
uint8_t *restart_bytes = NULL;
223
224
- reftable_block_done(&br->block);
224
+ block_source_return_block(&br->block);
225
226
if (!reftable_is_block_type(typ)) {
227
err = REFTABLE_FORMAT_ERROR;
@@ -285,7 +285,7 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block,
285
}
286
287
/* We're done with the input data. */
288
- reftable_block_done(block);
288
+ block_source_return_block(block);
289
block->data = br->uncompressed_data;
290
block->len = sz;
291
full_block_size = src_len + block_header_skip - br->zstream->avail_in;
@@ -324,7 +324,7 @@ void block_reader_release(struct block_reader *br)
324
inflateEnd(br->zstream);
325
reftable_free(br->zstream);
326
reftable_free(br->uncompressed_data);
327
- reftable_block_done(&br->block);
327
+ block_source_return_block(&br->block);
328
}
329
330
uint8_t block_reader_type(const struct block_reader *r)
@@ -570,14 +570,3 @@ void block_writer_release(struct block_writer *bw)
570
reftable_buf_release(&bw->last_key);
571
/* the block is not owned. */
572
}
573
-
574
-void reftable_block_done(struct reftable_block *blockp)
575
-{
576
- struct reftable_block_source source = blockp->source;
577
- if (blockp && source.ops)
578
- source.ops->return_block(source.arg, blockp);
579
- blockp->data = NULL;
580
- blockp->len = 0;
581
- blockp->source.ops = NULL;
582
- blockp->source.arg = NULL;
583
-}
reftable/block.h
-3
@@ -142,7 +142,4 @@ size_t header_size(int version);
142
/* size of file footer, depending on format version */
143
size_t footer_size(int version);
144
145
-/* returns a block to its source. */
146
-void reftable_block_done(struct reftable_block *ret);
147
-
145
#endif
reftable/blocksource.c
+35
@@ -13,6 +13,41 @@
13
#include "reftable-blocksource.h"
14
#include "reftable-error.h"
15
16
+void block_source_return_block(struct reftable_block *block)
17
+{
18
+ struct reftable_block_source source = block->source;
19
+ if (block && source.ops)
20
+ source.ops->return_block(source.arg, block);
21
+ block->data = NULL;
22
+ block->len = 0;
23
+ block->source.ops = NULL;
24
+ block->source.arg = NULL;
25
+}
26
+
27
+void block_source_close(struct reftable_block_source *source)
28
+{
29
+ if (!source->ops) {
30
+ return;
31
+ }
32
+
33
+ source->ops->close(source->arg);
34
+ source->ops = NULL;
35
+}
36
+
37
+ssize_t block_source_read_block(struct reftable_block_source *source,
38
+ struct reftable_block *dest, uint64_t off,
39
+ uint32_t size)
40
+{
41
+ ssize_t result = source->ops->read_block(source->arg, dest, off, size);
42
+ dest->source = *source;
43
+ return result;
44
+}
45
+
46
+uint64_t block_source_size(struct reftable_block_source *source)
47
+{
48
+ return source->ops->size(source->arg);
49
+}
50
+
51
static void reftable_buf_return_block(void *b REFTABLE_UNUSED, struct reftable_block *dest)
52
{
53
if (dest->len)
reftable/blocksource.h
+26
-1
@@ -12,9 +12,34 @@
12
#include "system.h"
13
14
struct reftable_block_source;
15
+struct reftable_block;
16
struct reftable_buf;
17
17
-/* Create an in-memory block source for reading reftables */
18
+/*
19
+ * Close the block source and the underlying resource. This is a no-op in case
20
+ * the block source is zero-initialized.
21
+ */
22
+void block_source_close(struct reftable_block_source *source);
23
+
24
+/*
25
+ * Read a block of length `size` from the source at the given `off`.
26
+ */
27
+ssize_t block_source_read_block(struct reftable_block_source *source,
28
+ struct reftable_block *dest, uint64_t off,
29
+ uint32_t size);
30
+
31
+/*
32
+ * Return the total length of the underlying resource.
33
+ */
34
+uint64_t block_source_size(struct reftable_block_source *source);
35
+
36
+/*
37
+ * Return a block to its original source, releasing any resources associated
38
+ * with it.
39
+ */
40
+void block_source_return_block(struct reftable_block *block);
41
+
42
+/* Create an in-memory block source for reading reftables. */
43
void block_source_from_buf(struct reftable_block_source *bs,
44
struct reftable_buf *buf);
45
reftable/iter.c
+3
-2
@@ -11,6 +11,7 @@
11
#include "system.h"
12
13
#include "block.h"
14
+#include "blocksource.h"
15
#include "constants.h"
16
#include "reftable-error.h"
17
#include "table.h"
@@ -113,7 +114,7 @@ static void indexed_table_ref_iter_close(void *p)
114
{
115
struct indexed_table_ref_iter *it = p;
116
block_iter_close(&it->cur);
116
- reftable_block_done(&it->block_reader.block);
117
+ block_source_return_block(&it->block_reader.block);
118
reftable_free(it->offsets);
119
reftable_buf_release(&it->oid);
120
}
@@ -127,7 +128,7 @@ static int indexed_table_ref_iter_next_block(struct indexed_table_ref_iter *it)
128
return 1;
129
}
130
130
- reftable_block_done(&it->block_reader.block);
131
+ block_source_return_block(&it->block_reader.block);
132
133
off = it->offsets[it->offset_idx++];
134
err = table_init_block_reader(it->table, &it->block_reader, off,
reftable/reftable-blocksource.h
+2
-1
@@ -11,7 +11,8 @@
11
12
#include <stdint.h>
13
14
-/* block_source is a generic wrapper for a seekable readable file.
14
+/*
15
+ * Generic wrapper for a seekable readable file.
16
*/
17
struct reftable_block_source {
18
struct reftable_block_source_vtable *ops;
reftable/table.c
+5
-28
@@ -10,35 +10,12 @@
10
11
#include "system.h"
12
#include "block.h"
13
+#include "blocksource.h"
14
#include "constants.h"
15
#include "iter.h"
16
#include "record.h"
17
#include "reftable-error.h"
18
18
-uint64_t block_source_size(struct reftable_block_source *source)
19
-{
20
- return source->ops->size(source->arg);
21
-}
22
-
23
-ssize_t block_source_read_block(struct reftable_block_source *source,
24
- struct reftable_block *dest, uint64_t off,
25
- uint32_t size)
26
-{
27
- ssize_t result = source->ops->read_block(source->arg, dest, off, size);
28
- dest->source = *source;
29
- return result;
30
-}
31
-
32
-void block_source_close(struct reftable_block_source *source)
33
-{
34
- if (!source->ops) {
35
- return;
36
- }
37
-
38
- source->ops->close(source->arg);
39
- source->ops = NULL;
40
-}
41
-
19
static struct reftable_table_offsets *
20
table_offsets_for(struct reftable_table *t, uint8_t typ)
21
{
@@ -249,7 +226,7 @@ int table_init_block_reader(struct reftable_table *t, struct block_reader *br,
226
}
227
228
if (block_size > guess_block_size) {
252
- reftable_block_done(&block);
229
+ block_source_return_block(&block);
230
err = table_get_block(t, &block, next_off, block_size);
231
if (err < 0) {
232
goto done;
@@ -259,7 +236,7 @@ int table_init_block_reader(struct reftable_table *t, struct block_reader *br,
236
err = block_reader_init(br, &block, header_off, t->block_size,
237
hash_size(t->hash_id));
238
done:
262
- reftable_block_done(&block);
239
+ block_source_return_block(&block);
240
241
return err;
242
}
@@ -666,8 +643,8 @@ int reftable_table_new(struct reftable_table **out,
643
*out = t;
644
645
done:
669
- reftable_block_done(&footer);
670
- reftable_block_done(&header);
646
+ block_source_return_block(&footer);
647
+ block_source_return_block(&header);
648
if (err) {
649
if (t)
650
reftable_free(t->name);
reftable/table.h
-7
@@ -14,13 +14,6 @@
14
#include "reftable-iterator.h"
15
#include "reftable-table.h"
16
17
-uint64_t block_source_size(struct reftable_block_source *source);
18
-
19
-ssize_t block_source_read_block(struct reftable_block_source *source,
20
- struct reftable_block *dest, uint64_t off,
21
- uint32_t size);
22
-void block_source_close(struct reftable_block_source *source);
23
-
17
/* metadata for a block type */
18
struct reftable_table_offsets {
19
int is_present;
t/unit-tests/t-reftable-block.c
+4
-4
@@ -100,7 +100,7 @@ static void t_ref_block_read_write(void)
100
block_reader_release(&br);
101
block_iter_close(&it);
102
reftable_record_release(&rec);
103
- reftable_block_done(&br.block);
103
+ block_source_return_block(&br.block);
104
reftable_buf_release(&want);
105
reftable_buf_release(&buf);
106
for (i = 0; i < N; i++)
@@ -190,7 +190,7 @@ static void t_log_block_read_write(void)
190
block_reader_release(&br);
191
block_iter_close(&it);
192
reftable_record_release(&rec);
193
- reftable_block_done(&br.block);
193
+ block_source_return_block(&br.block);
194
reftable_buf_release(&want);
195
reftable_buf_release(&buf);
196
for (i = 0; i < N; i++)
@@ -273,7 +273,7 @@ static void t_obj_block_read_write(void)
273
block_reader_release(&br);
274
block_iter_close(&it);
275
reftable_record_release(&rec);
276
- reftable_block_done(&br.block);
276
+ block_source_return_block(&br.block);
277
reftable_buf_release(&want);
278
reftable_buf_release(&buf);
279
for (i = 0; i < N; i++)
@@ -365,7 +365,7 @@ static void t_index_block_read_write(void)
365
block_reader_release(&br);
366
block_iter_close(&it);
367
reftable_record_release(&rec);
368
- reftable_block_done(&br.block);
368
+ block_source_return_block(&br.block);
369
reftable_buf_release(&want);
370
reftable_buf_release(&buf);
371
for (i = 0; i < N; i++)
t/unit-tests/t-reftable-readwrite.c
+2
-2
@@ -32,13 +32,13 @@ static void t_buffer(void)
32
n = block_source_read_block(&source, &out, 0, sizeof(in));
33
check_int(n, ==, sizeof(in));
34
check(!memcmp(in, out.data, n));
35
- reftable_block_done(&out);
35
+ block_source_return_block(&out);
36
37
n = block_source_read_block(&source, &out, 1, 2);
38
check_int(n, ==, 2);
39
check(!memcmp(out.data, "el", 2));
40
41
- reftable_block_done(&out);
41
+ block_source_return_block(&out);
42
block_source_close(&source);
43
reftable_buf_release(&buf);
44
}