Instead of storing commit graphs in static variables, store them in struct object_store. There are no changes to the signatures of existing functions - they all still only support the_repository, and support for other instances of struct repository will be added in a subsequent commit. Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- commit-graph.c | 34 ++++++++++++++++++---------------- object-store.h | 3 +++ object.c | 5 +++++ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/commit-graph.c b/commit-graph.c index 9f4e761229..61b4fbb925 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -179,45 +179,42 @@ struct commit_graph *load_commit_graph_one(const char *graph_file) exit(1); } -/* global storage */ -static struct commit_graph *commit_graph = NULL; - static void prepare_commit_graph_one(const char *obj_dir) { char *graph_name; - if (commit_graph) + if (the_repository->objects->commit_graph) return; graph_name = get_commit_graph_filename(obj_dir); - commit_graph = load_commit_graph_one(graph_name); + the_repository->objects->commit_graph = + load_commit_graph_one(graph_name); FREE_AND_NULL(graph_name); } -static int prepare_commit_graph_run_once = 0; static void prepare_commit_graph(void) { struct alternate_object_database *alt; char *obj_dir; - if (prepare_commit_graph_run_once) + if (the_repository->objects->commit_graph_attempted) return; - prepare_commit_graph_run_once = 1; + the_repository->objects->commit_graph_attempted = 1; obj_dir = get_object_directory(); prepare_commit_graph_one(obj_dir); prepare_alt_odb(the_repository); for (alt = the_repository->objects->alt_odb_list; - !commit_graph && alt; + !the_repository->objects->commit_graph && alt; alt = alt->next) prepare_commit_graph_one(alt->path); } static void close_commit_graph(void) { - free_commit_graph(commit_graph); - commit_graph = NULL; + free_commit_graph(the_repository->objects->commit_graph); + the_repository->objects->commit_graph = NULL; } static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos) @@ -293,7 +290,9 @@ int parse_commit_in_graph(struct commit *item) return 1; prepare_commit_graph(); - if (commit_graph) { + if (the_repository->objects->commit_graph) { + struct commit_graph *commit_graph = + the_repository->objects->commit_graph; uint32_t pos; int found; if (item->graph_pos != COMMIT_NOT_FROM_GRAPH) { @@ -329,7 +328,8 @@ struct tree *get_commit_tree_in_graph(const struct commit *c) if (c->graph_pos == COMMIT_NOT_FROM_GRAPH) BUG("get_commit_tree_in_graph called from non-commit-graph commit"); - return load_tree_for_commit(commit_graph, (struct commit *)c); + return load_tree_for_commit(the_repository->objects->commit_graph, + (struct commit *)c); } static void write_graph_chunk_fanout(struct hashfile *f, @@ -589,15 +589,17 @@ void write_commit_graph(const char *obj_dir, if (append) { prepare_commit_graph_one(obj_dir); - if (commit_graph) - oids.alloc += commit_graph->num_commits; + if (the_repository->objects->commit_graph) + oids.alloc += the_repository->objects->commit_graph->num_commits; } if (oids.alloc < 1024) oids.alloc = 1024; ALLOC_ARRAY(oids.list, oids.alloc); - if (append && commit_graph) { + if (append && the_repository->objects->commit_graph) { + struct commit_graph *commit_graph = + the_repository->objects->commit_graph; for (i = 0; i < commit_graph->num_commits; i++) { const unsigned char *hash = commit_graph->chunk_oid_lookup + commit_graph->hash_len * i; diff --git a/object-store.h b/object-store.h index f0b77146e4..39f4a3d5b9 100644 --- a/object-store.h +++ b/object-store.h @@ -106,6 +106,9 @@ struct raw_object_store { */ struct oidmap *replace_map; + struct commit_graph *commit_graph; + unsigned commit_graph_attempted : 1; /* if loading has been attempted */ + /* * private data * diff --git a/object.c b/object.c index f7f4de3aaf..04954f4f3e 100644 --- a/object.c +++ b/object.c @@ -7,6 +7,7 @@ #include "tag.h" #include "object-store.h" #include "packfile.h" +#include "commit-graph.h" static struct object **obj_hash; static int nr_objs, obj_hash_size; @@ -484,6 +485,10 @@ void raw_object_store_clear(struct raw_object_store *o) oidmap_free(o->replace_map, 1); FREE_AND_NULL(o->replace_map); + free_commit_graph(o->commit_graph); + o->commit_graph = NULL; + o->commit_graph_attempted = 0; + free_alt_odbs(o); o->alt_odb_tail = NULL; -- 2.18.0.rc2.347.g0da03f3a46.dirty