]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb: refactor `odb_clear()` to `odb_free()`
authorPatrick Steinhardt <ps@pks.im>
Wed, 19 Nov 2025 07:50:52 +0000 (08:50 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 20 Nov 2025 01:41:03 +0000 (17:41 -0800)
The function `odb_clear()` releases all resources allocated to an object
database and ensures that all fields become zero'd out. Despite its
naming though it doesn't really clear the object database so that it
becomes ready for reuse afterwards again -- the caller would first have
to reinitialize it, and that contradicts the terminology of "clearing"
as we have defined it in our coding guidelines.

There isn't really only a reason to have "clearing" semantics, either.
There's only a single caller of `odb_clear()`, and that caller also ends
up freeing the object database structure itself.

Refactor the function to have "freeing" semantics instead, so that the
structure itself is also freed, which allows us to drop some useless
boilerplate to zero out the structure's members.

This refactoring reveals that we're trying to close the commit graph
multiple times: once directly via `free_commit_graph()`, and once via
`odb_close()`. Drop the former call.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
odb.c
odb.h
repository.c

diff --git a/odb.c b/odb.c
index bcefa5cede60b524852c19a8b1f9ab03382dab88..29cf6496c5e50aff2e67b0cc81d08b97ae0b613f 100644 (file)
--- a/odb.c
+++ b/odb.c
@@ -1073,30 +1073,27 @@ static void odb_free_sources(struct object_database *o)
        o->source_by_path = NULL;
 }
 
-void odb_clear(struct object_database *o)
+void odb_free(struct object_database *o)
 {
-       FREE_AND_NULL(o->alternate_db);
+       if (!o)
+               return;
+
+       free(o->alternate_db);
 
        oidmap_clear(&o->replace_map, 1);
        pthread_mutex_destroy(&o->replace_mutex);
 
-       free_commit_graph(o->commit_graph);
-       o->commit_graph = NULL;
-       o->commit_graph_attempted = 0;
-
        odb_free_sources(o);
-       o->sources_tail = NULL;
-       o->loaded_alternates = 0;
 
        for (size_t i = 0; i < o->cached_object_nr; i++)
                free((char *) o->cached_objects[i].value.buf);
-       FREE_AND_NULL(o->cached_objects);
+       free(o->cached_objects);
 
        odb_close(o);
        packfile_store_free(o->packfiles);
-       o->packfiles = NULL;
-
        string_list_clear(&o->submodule_source_paths, 0);
+
+       free(o);
 }
 
 void odb_reprepare(struct object_database *o)
diff --git a/odb.h b/odb.h
index 71b4897c82f3a87146422b4eff92ab61c1455b53..77b313b784cad38303ee4aecc0f2f6f1d3a9d7b7 100644 (file)
--- a/odb.h
+++ b/odb.h
@@ -167,7 +167,9 @@ struct object_database {
 };
 
 struct object_database *odb_new(struct repository *repo);
-void odb_clear(struct object_database *o);
+
+/* Free the object database and release all resources. */
+void odb_free(struct object_database *o);
 
 /*
  * Close the object database and all of its sources so that any held resources
index 6aaa7ba00869bf6aa0450f3fbdf27590f7439228..3c8b3813b00af00c30d1954ffd656744cfe5cfbb 100644 (file)
@@ -382,8 +382,8 @@ void repo_clear(struct repository *repo)
        FREE_AND_NULL(repo->worktree);
        FREE_AND_NULL(repo->submodule_prefix);
 
-       odb_clear(repo->objects);
-       FREE_AND_NULL(repo->objects);
+       odb_free(repo->objects);
+       repo->objects = NULL;
 
        parsed_object_pool_clear(repo->parsed_objects);
        FREE_AND_NULL(repo->parsed_objects);