From: Patrick Steinhardt Date: Tue, 5 Mar 2024 12:11:12 +0000 (+0100) Subject: reftable/record: reuse message when decoding log records X-Git-Tag: v2.45.0-rc0~91^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0bd13beea95fa26fa1159a26051f21237f45088;p=thirdparty%2Fgit.git reftable/record: reuse message when decoding log records Same as the preceding commit we can allocate log messages as needed when decoding log records, thus further reducing the number of allocations. Before: HEAP SUMMARY: in use at exit: 13,473 bytes in 122 blocks total heap usage: 3,068,488 allocs, 3,068,366 frees, 307,122,961 bytes allocated After: HEAP SUMMARY: in use at exit: 13,473 bytes in 122 blocks total heap usage: 2,068,487 allocs, 2,068,365 frees, 305,122,946 bytes allocated Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/reftable/record.c b/reftable/record.c index 82780b2d06..7c86877586 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -871,6 +871,7 @@ static int reftable_log_record_decode(void *rec, struct strbuf key, switch (r->value_type) { case REFTABLE_LOG_UPDATE: FREE_AND_NULL(r->value.update.message); + r->value.update.message_cap = 0; FREE_AND_NULL(r->value.update.email); FREE_AND_NULL(r->value.update.name); break; @@ -943,8 +944,8 @@ static int reftable_log_record_decode(void *rec, struct strbuf key, goto done; string_view_consume(&in, n); - r->value.update.message = - reftable_realloc(r->value.update.message, dest.len + 1); + REFTABLE_ALLOC_GROW(r->value.update.message, dest.len + 1, + r->value.update.message_cap); memcpy(r->value.update.message, dest.buf, dest.len); r->value.update.message[dest.len] = 0; diff --git a/reftable/reftable-record.h b/reftable/reftable-record.h index d28f38175c..2a2943cd13 100644 --- a/reftable/reftable-record.h +++ b/reftable/reftable-record.h @@ -96,6 +96,7 @@ struct reftable_log_record { uint64_t time; int16_t tz_offset; char *message; + size_t message_cap; } update; } value; };