reftable: introduce `REFTABLE_FREE_AND_NULL()`

We have several calls to `FREE_AND_NULL()` in the reftable library, which of course uses free(3P). As the reftable allocators are pluggable we should rather call the reftable specific function, which is `reftable_free()`. Introduce a new macro `REFTABLE_FREE_AND_NULL()` and adapt the callsites accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Oct 2, 2024 at 12:56 UTC 24e0ade65baabccc3d6fcbde2f9c6eca0a0b7321
9 files changed +19 -18
reftable/basics.h
+1
@@ -71,6 +71,7 @@ char *reftable_strdup(const char *str);
71 REFTABLE_REALLOC_ARRAY(x, alloc); \
72 } \
73 } while (0)
74 +#define REFTABLE_FREE_AND_NULL(p) do { reftable_free(p); (p) = NULL; } while (0)
75
76 /* Find the longest shared prefix size of `a` and `b` */
77 struct strbuf;
reftable/block.c
+3 -3
@@ -551,9 +551,9 @@ done:
551 void block_writer_release(struct block_writer *bw)
552 {
553 deflateEnd(bw->zstream);
554 - FREE_AND_NULL(bw->zstream);
555 - FREE_AND_NULL(bw->restarts);
556 - FREE_AND_NULL(bw->compressed);
554 + REFTABLE_FREE_AND_NULL(bw->zstream);
555 + REFTABLE_FREE_AND_NULL(bw->restarts);
556 + REFTABLE_FREE_AND_NULL(bw->compressed);
557 strbuf_release(&bw->last_key);
558 /* the block is not owned. */
559 }
reftable/iter.c
+1 -1
@@ -237,7 +237,7 @@ void reftable_iterator_destroy(struct reftable_iterator *it)
237 return;
238 it->ops->close(it->iter_arg);
239 it->ops = NULL;
240 - FREE_AND_NULL(it->iter_arg);
240 + REFTABLE_FREE_AND_NULL(it->iter_arg);
241 }
242
243 int reftable_iterator_seek_ref(struct reftable_iterator *it,
reftable/pq.c
+1 -1
@@ -68,6 +68,6 @@ int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry
68
69 void merged_iter_pqueue_release(struct merged_iter_pqueue *pq)
70 {
71 - FREE_AND_NULL(pq->heap);
71 + REFTABLE_FREE_AND_NULL(pq->heap);
72 memset(pq, 0, sizeof(*pq));
73 }
reftable/reader.c
+1 -1
@@ -678,7 +678,7 @@ void reftable_reader_decref(struct reftable_reader *r)
678 if (--r->refcount)
679 return;
680 block_source_close(&r->source);
681 - FREE_AND_NULL(r->name);
681 + REFTABLE_FREE_AND_NULL(r->name);
682 reftable_free(r);
683 }
684
reftable/record.c
+5 -5
@@ -476,8 +476,8 @@ static void reftable_obj_record_key(const void *r, struct strbuf *dest)
476 static void reftable_obj_record_release(void *rec)
477 {
478 struct reftable_obj_record *obj = rec;
479 - FREE_AND_NULL(obj->hash_prefix);
480 - FREE_AND_NULL(obj->offsets);
479 + REFTABLE_FREE_AND_NULL(obj->hash_prefix);
480 + REFTABLE_FREE_AND_NULL(obj->offsets);
481 memset(obj, 0, sizeof(struct reftable_obj_record));
482 }
483
@@ -834,10 +834,10 @@ static int reftable_log_record_decode(void *rec, struct strbuf key,
834 if (val_type != r->value_type) {
835 switch (r->value_type) {
836 case REFTABLE_LOG_UPDATE:
837 - FREE_AND_NULL(r->value.update.message);
837 + REFTABLE_FREE_AND_NULL(r->value.update.message);
838 r->value.update.message_cap = 0;
839 - FREE_AND_NULL(r->value.update.email);
840 - FREE_AND_NULL(r->value.update.name);
839 + REFTABLE_FREE_AND_NULL(r->value.update.email);
840 + REFTABLE_FREE_AND_NULL(r->value.update.name);
841 break;
842 case REFTABLE_LOG_DELETION:
843 break;
reftable/stack.c
+4 -4
@@ -203,7 +203,7 @@ void reftable_stack_destroy(struct reftable_stack *st)
203
204 err = read_lines(st->list_file, &names);
205 if (err < 0) {
206 - FREE_AND_NULL(names);
206 + REFTABLE_FREE_AND_NULL(names);
207 }
208
209 if (st->readers) {
@@ -224,7 +224,7 @@ void reftable_stack_destroy(struct reftable_stack *st)
224 }
225 strbuf_release(&filename);
226 st->readers_len = 0;
227 - FREE_AND_NULL(st->readers);
227 + REFTABLE_FREE_AND_NULL(st->readers);
228 }
229
230 if (st->list_fd >= 0) {
@@ -232,8 +232,8 @@ void reftable_stack_destroy(struct reftable_stack *st)
232 st->list_fd = -1;
233 }
234
235 - FREE_AND_NULL(st->list_file);
236 - FREE_AND_NULL(st->reftable_dir);
235 + REFTABLE_FREE_AND_NULL(st->list_file);
236 + REFTABLE_FREE_AND_NULL(st->reftable_dir);
237 reftable_free(st);
238 free_names(names);
239 }
reftable/writer.c
+2 -2
@@ -593,7 +593,7 @@ static void object_record_free(void *void_arg UNUSED, void *key)
593 {
594 struct obj_index_tree_node *entry = key;
595
596 - FREE_AND_NULL(entry->offsets);
596 + REFTABLE_FREE_AND_NULL(entry->offsets);
597 strbuf_release(&entry->hash);
598 reftable_free(entry);
599 }
@@ -709,7 +709,7 @@ static void writer_clear_index(struct reftable_writer *w)
709 {
710 for (size_t i = 0; w->index && i < w->index_len; i++)
711 strbuf_release(&w->index[i].last_key);
712 - FREE_AND_NULL(w->index);
712 + REFTABLE_FREE_AND_NULL(w->index);
713 w->index_len = 0;
714 w->index_cap = 0;
715 }
t/unit-tests/t-reftable-stack.c
+1 -1
@@ -1149,7 +1149,7 @@ static void unclean_stack_close(struct reftable_stack *st)
1149 for (size_t i = 0; i < st->readers_len; i++)
1150 reftable_reader_decref(st->readers[i]);
1151 st->readers_len = 0;
1152 - FREE_AND_NULL(st->readers);
1152 + REFTABLE_FREE_AND_NULL(st->readers);
1153 }
1154
1155 static void t_reftable_stack_compaction_concurrent_clean(void)