Skip to content

Commit f424d7c

Browse files
committed
Merge branch 'ps/reftable-styles'
Code clean-up in various reftable code paths. * ps/reftable-styles: reftable/record: improve semantics when initializing records reftable/merged: refactor initialization of iterators reftable/merged: refactor seeking of records reftable/stack: use `size_t` to track stack length reftable/stack: use `size_t` to track stack slices during compaction reftable/stack: index segments with `size_t` reftable/stack: fix parameter validation when compacting range reftable: introduce macros to allocate arrays reftable: introduce macros to grow arrays
2 parents cf4a3bd + 3ddef47 commit f424d7c

22 files changed

+236
-295
lines changed

reftable/basics.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,11 @@ void free_names(char **a)
6464
reftable_free(a);
6565
}
6666

67-
int names_length(char **names)
67+
size_t names_length(char **names)
6868
{
6969
char **p = names;
70-
for (; *p; p++) {
71-
/* empty */
72-
}
70+
while (*p)
71+
p++;
7372
return p - names;
7473
}
7574

@@ -89,17 +88,13 @@ void parse_names(char *buf, int size, char ***namesp)
8988
next = end;
9089
}
9190
if (p < next) {
92-
if (names_len == names_cap) {
93-
names_cap = 2 * names_cap + 1;
94-
names = reftable_realloc(
95-
names, names_cap * sizeof(*names));
96-
}
91+
REFTABLE_ALLOC_GROW(names, names_len + 1, names_cap);
9792
names[names_len++] = xstrdup(p);
9893
}
9994
p = next + 1;
10095
}
10196

102-
names = reftable_realloc(names, (names_len + 1) * sizeof(*names));
97+
REFTABLE_REALLOC_ARRAY(names, names_len + 1);
10398
names[names_len] = NULL;
10499
*namesp = names;
105100
}

reftable/basics.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,27 @@ void parse_names(char *buf, int size, char ***namesp);
4444
int names_equal(char **a, char **b);
4545

4646
/* returns the array size of a NULL-terminated array of strings. */
47-
int names_length(char **names);
47+
size_t names_length(char **names);
4848

4949
/* Allocation routines; they invoke the functions set through
5050
* reftable_set_alloc() */
5151
void *reftable_malloc(size_t sz);
5252
void *reftable_realloc(void *p, size_t sz);
5353
void reftable_free(void *p);
54-
void *reftable_calloc(size_t sz);
54+
void *reftable_calloc(size_t nelem, size_t elsize);
55+
56+
#define REFTABLE_ALLOC_ARRAY(x, alloc) (x) = reftable_malloc(st_mult(sizeof(*(x)), (alloc)))
57+
#define REFTABLE_CALLOC_ARRAY(x, alloc) (x) = reftable_calloc((alloc), sizeof(*(x)))
58+
#define REFTABLE_REALLOC_ARRAY(x, alloc) (x) = reftable_realloc((x), st_mult(sizeof(*(x)), (alloc)))
59+
#define REFTABLE_ALLOC_GROW(x, nr, alloc) \
60+
do { \
61+
if ((nr) > alloc) { \
62+
alloc = 2 * (alloc) + 1; \
63+
if (alloc < (nr)) \
64+
alloc = (nr); \
65+
REFTABLE_REALLOC_ARRAY(x, alloc); \
66+
} \
67+
} while (0)
5568

5669
/* Find the longest shared prefix size of `a` and `b` */
5770
struct strbuf;

reftable/block.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,7 @@ static int block_writer_register_restart(struct block_writer *w, int n,
5151
if (2 + 3 * rlen + n > w->block_size - w->next)
5252
return -1;
5353
if (is_restart) {
54-
if (w->restart_len == w->restart_cap) {
55-
w->restart_cap = w->restart_cap * 2 + 1;
56-
w->restarts = reftable_realloc(
57-
w->restarts, sizeof(uint32_t) * w->restart_cap);
58-
}
59-
54+
REFTABLE_ALLOC_GROW(w->restarts, w->restart_len + 1, w->restart_cap);
6055
w->restarts[w->restart_len++] = w->next;
6156
}
6257

@@ -148,8 +143,10 @@ int block_writer_finish(struct block_writer *w)
148143
int block_header_skip = 4 + w->header_off;
149144
uLongf src_len = w->next - block_header_skip;
150145
uLongf dest_cap = src_len * 1.001 + 12;
146+
uint8_t *compressed;
147+
148+
REFTABLE_ALLOC_ARRAY(compressed, dest_cap);
151149

152-
uint8_t *compressed = reftable_malloc(dest_cap);
153150
while (1) {
154151
uLongf out_dest_len = dest_cap;
155152
int zresult = compress2(compressed, &out_dest_len,
@@ -206,9 +203,9 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block,
206203
uLongf dst_len = sz - block_header_skip; /* total size of dest
207204
buffer. */
208205
uLongf src_len = block->len - block_header_skip;
209-
/* Log blocks specify the *uncompressed* size in their header.
210-
*/
211-
uncompressed = reftable_malloc(sz);
206+
207+
/* Log blocks specify the *uncompressed* size in their header. */
208+
REFTABLE_ALLOC_ARRAY(uncompressed, sz);
212209

213210
/* Copy over the block header verbatim. It's not compressed. */
214211
memcpy(uncompressed, block->data, block_header_skip);
@@ -385,23 +382,23 @@ int block_reader_seek(struct block_reader *br, struct block_iter *it,
385382
.key = *want,
386383
.r = br,
387384
};
388-
struct reftable_record rec = reftable_new_record(block_reader_type(br));
389-
int err = 0;
390385
struct block_iter next = BLOCK_ITER_INIT;
386+
struct reftable_record rec;
387+
int err = 0, i;
391388

392-
int i = binsearch(br->restart_count, &restart_key_less, &args);
393389
if (args.error) {
394390
err = REFTABLE_FORMAT_ERROR;
395391
goto done;
396392
}
397393

398-
it->br = br;
399-
if (i > 0) {
400-
i--;
401-
it->next_off = block_reader_restart_offset(br, i);
402-
} else {
394+
i = binsearch(br->restart_count, &restart_key_less, &args);
395+
if (i > 0)
396+
it->next_off = block_reader_restart_offset(br, i - 1);
397+
else
403398
it->next_off = br->header_off + 4;
404-
}
399+
it->br = br;
400+
401+
reftable_record_init(&rec, block_reader_type(br));
405402

406403
/* We're looking for the last entry less/equal than the wanted key, so
407404
we have to go one entry too far and then back up.

reftable/block_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static void test_block_read_write(void)
3636
int j = 0;
3737
struct strbuf want = STRBUF_INIT;
3838

39-
block.data = reftable_calloc(block_size);
39+
REFTABLE_CALLOC_ARRAY(block.data, block_size);
4040
block.len = block_size;
4141
block.source = malloc_block_source();
4242
block_writer_init(&bw, BLOCK_TYPE_REF, block.data, block_size,

reftable/blocksource.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static int strbuf_read_block(void *v, struct reftable_block *dest, uint64_t off,
2929
{
3030
struct strbuf *b = v;
3131
assert(off + size <= b->len);
32-
dest->data = reftable_calloc(size);
32+
REFTABLE_CALLOC_ARRAY(dest->data, size);
3333
memcpy(dest->data, b->buf + off, size);
3434
dest->len = size;
3535
return size;
@@ -132,7 +132,7 @@ int reftable_block_source_from_file(struct reftable_block_source *bs,
132132
return REFTABLE_IO_ERROR;
133133
}
134134

135-
p = reftable_calloc(sizeof(*p));
135+
REFTABLE_CALLOC_ARRAY(p, 1);
136136
p->size = st.st_size;
137137
p->data = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
138138
close(fd);

reftable/iter.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,7 @@ int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest,
160160
int oid_len, uint64_t *offsets, int offset_len)
161161
{
162162
struct indexed_table_ref_iter empty = INDEXED_TABLE_REF_ITER_INIT;
163-
struct indexed_table_ref_iter *itr =
164-
reftable_calloc(sizeof(struct indexed_table_ref_iter));
163+
struct indexed_table_ref_iter *itr = reftable_calloc(1, sizeof(*itr));
165164
int err = 0;
166165

167166
*itr = empty;

reftable/merged.c

Lines changed: 44 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,23 @@ license that can be found in the LICENSE file or at
1919

2020
static int merged_iter_init(struct merged_iter *mi)
2121
{
22-
int i = 0;
23-
for (i = 0; i < mi->stack_len; i++) {
24-
struct reftable_record rec = reftable_new_record(mi->typ);
25-
int err = iterator_next(&mi->stack[i], &rec);
26-
if (err < 0) {
22+
for (size_t i = 0; i < mi->stack_len; i++) {
23+
struct pq_entry e = {
24+
.index = i,
25+
};
26+
int err;
27+
28+
reftable_record_init(&e.rec, mi->typ);
29+
err = iterator_next(&mi->stack[i], &e.rec);
30+
if (err < 0)
2731
return err;
28-
}
29-
3032
if (err > 0) {
3133
reftable_iterator_destroy(&mi->stack[i]);
32-
reftable_record_release(&rec);
33-
} else {
34-
struct pq_entry e = {
35-
.rec = rec,
36-
.index = i,
37-
};
38-
merged_iter_pqueue_add(&mi->pq, &e);
34+
reftable_record_release(&e.rec);
35+
continue;
3936
}
37+
38+
merged_iter_pqueue_add(&mi->pq, &e);
4039
}
4140

4241
return 0;
@@ -45,11 +44,10 @@ static int merged_iter_init(struct merged_iter *mi)
4544
static void merged_iter_close(void *p)
4645
{
4746
struct merged_iter *mi = p;
48-
int i = 0;
47+
4948
merged_iter_pqueue_release(&mi->pq);
50-
for (i = 0; i < mi->stack_len; i++) {
49+
for (size_t i = 0; i < mi->stack_len; i++)
5150
reftable_iterator_destroy(&mi->stack[i]);
52-
}
5351
reftable_free(mi->stack);
5452
strbuf_release(&mi->key);
5553
strbuf_release(&mi->entry_key);
@@ -59,10 +57,12 @@ static int merged_iter_advance_nonnull_subiter(struct merged_iter *mi,
5957
size_t idx)
6058
{
6159
struct pq_entry e = {
62-
.rec = reftable_new_record(mi->typ),
6360
.index = idx,
6461
};
65-
int err = iterator_next(&mi->stack[idx], &e.rec);
62+
int err;
63+
64+
reftable_record_init(&e.rec, mi->typ);
65+
err = iterator_next(&mi->stack[idx], &e.rec);
6666
if (err < 0)
6767
return err;
6868

@@ -168,14 +168,14 @@ static void iterator_from_merged_iter(struct reftable_iterator *it,
168168
}
169169

170170
int reftable_new_merged_table(struct reftable_merged_table **dest,
171-
struct reftable_table *stack, int n,
171+
struct reftable_table *stack, size_t n,
172172
uint32_t hash_id)
173173
{
174174
struct reftable_merged_table *m = NULL;
175175
uint64_t last_max = 0;
176176
uint64_t first_min = 0;
177-
int i = 0;
178-
for (i = 0; i < n; i++) {
177+
178+
for (size_t i = 0; i < n; i++) {
179179
uint64_t min = reftable_table_min_update_index(&stack[i]);
180180
uint64_t max = reftable_table_max_update_index(&stack[i]);
181181

@@ -190,7 +190,7 @@ int reftable_new_merged_table(struct reftable_merged_table **dest,
190190
}
191191
}
192192

193-
m = reftable_calloc(sizeof(struct reftable_merged_table));
193+
REFTABLE_CALLOC_ARRAY(m, 1);
194194
m->stack = stack;
195195
m->stack_len = n;
196196
m->min = first_min;
@@ -239,50 +239,38 @@ static int merged_table_seek_record(struct reftable_merged_table *mt,
239239
struct reftable_iterator *it,
240240
struct reftable_record *rec)
241241
{
242-
struct reftable_iterator *iters = reftable_calloc(
243-
sizeof(struct reftable_iterator) * mt->stack_len);
244242
struct merged_iter merged = {
245-
.stack = iters,
246243
.typ = reftable_record_type(rec),
247244
.hash_id = mt->hash_id,
248245
.suppress_deletions = mt->suppress_deletions,
249246
.key = STRBUF_INIT,
250247
.entry_key = STRBUF_INIT,
251248
};
252-
int n = 0;
253-
int err = 0;
254-
int i = 0;
255-
for (i = 0; i < mt->stack_len && err == 0; i++) {
256-
int e = reftable_table_seek_record(&mt->stack[i], &iters[n],
257-
rec);
258-
if (e < 0) {
259-
err = e;
260-
}
261-
if (e == 0) {
262-
n++;
263-
}
264-
}
265-
if (err < 0) {
266-
int i = 0;
267-
for (i = 0; i < n; i++) {
268-
reftable_iterator_destroy(&iters[i]);
269-
}
270-
reftable_free(iters);
271-
return err;
249+
struct merged_iter *p;
250+
int err;
251+
252+
REFTABLE_CALLOC_ARRAY(merged.stack, mt->stack_len);
253+
for (size_t i = 0; i < mt->stack_len; i++) {
254+
err = reftable_table_seek_record(&mt->stack[i],
255+
&merged.stack[merged.stack_len], rec);
256+
if (err < 0)
257+
goto out;
258+
if (!err)
259+
merged.stack_len++;
272260
}
273261

274-
merged.stack_len = n;
275262
err = merged_iter_init(&merged);
276-
if (err < 0) {
263+
if (err < 0)
264+
goto out;
265+
266+
p = reftable_malloc(sizeof(struct merged_iter));
267+
*p = merged;
268+
iterator_from_merged_iter(it, p);
269+
270+
out:
271+
if (err < 0)
277272
merged_iter_close(&merged);
278-
return err;
279-
} else {
280-
struct merged_iter *p =
281-
reftable_malloc(sizeof(struct merged_iter));
282-
*p = merged;
283-
iterator_from_merged_iter(it, p);
284-
}
285-
return 0;
273+
return err;
286274
}
287275

288276
int reftable_merged_table_seek_ref(struct reftable_merged_table *mt,

0 commit comments

Comments
 (0)