aboutsummaryrefslogtreecommitdiffstats
path: root/object-file.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2025-11-03 08:42:02 +0100
committerJunio C Hamano <gitster@pobox.com>2025-11-03 12:18:46 -0800
commitbe659c97eae3b68e38b71f0a67067dede23903b5 (patch)
treed1964ece9ec66306ac485214f4bffb2f5e93b1be /object-file.c
parent90a93f9dea88532623ef7422dbc21d8dc70a58dd (diff)
downloadgit-be659c97eae3b68e38b71f0a67067dede23903b5.tar.gz
object-file: hide internals when we need to reprepare loose sources
There are two different situations where we have to clear the cache of loose objects: - When freeing the loose object source itself to avoid memory leaks. - When repreparing the loose object source so that any potentially- stale data is getting evicted from the cache. The former is already handled by `odb_source_loose_free()`. But the latter case is still done manually by in `odb_reprepare()`, so we are leaking internals into that code. Introduce a new `odb_source_loose_reprepare()` function as an equivalent to `packfile_store_prepare()` to hide these implementation details. Furthermore, while at it, rename the function `odb_clear_loose_cache()` to `odb_source_loose_clear()`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'object-file.c')
-rw-r--r--object-file.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/object-file.c b/object-file.c
index fef00d6d3d..20daa629a1 100644
--- a/object-file.c
+++ b/object-file.c
@@ -1834,12 +1834,17 @@ struct oidtree *odb_source_loose_cache(struct odb_source *source,
return source->loose->cache;
}
-void odb_clear_loose_cache(struct odb_source *source)
+static void odb_source_loose_clear_cache(struct odb_source_loose *loose)
{
- oidtree_clear(source->loose->cache);
- FREE_AND_NULL(source->loose->cache);
- memset(&source->loose->subdir_seen, 0,
- sizeof(source->loose->subdir_seen));
+ oidtree_clear(loose->cache);
+ FREE_AND_NULL(loose->cache);
+ memset(&loose->subdir_seen, 0,
+ sizeof(loose->subdir_seen));
+}
+
+void odb_source_loose_reprepare(struct odb_source *source)
+{
+ odb_source_loose_clear_cache(source->loose);
}
static int check_stream_oid(git_zstream *stream,
@@ -2008,6 +2013,6 @@ void odb_source_loose_free(struct odb_source_loose *loose)
{
if (!loose)
return;
- odb_clear_loose_cache(loose->source);
+ odb_source_loose_clear_cache(loose);
free(loose);
}