cache API: add a "INDEX_STATE_INIT" macro/function, add release_index()

Hopefully in some not so distant future, we'll get advantages from always
initializing the "repo" member of the "struct index_state". To make
that easier let's introduce an initialization macro & function.

The various ad-hoc initialization of the structure can then be changed
over to it, and we can remove the various "0" assignments in
discard_index() in favor of calling index_state_init() at the end.

While not strictly necessary, let's also change the CALLOC_ARRAY() of
various "struct index_state *" to use an ALLOC_ARRAY() followed by
index_state_init() instead.

We're then adding the release_index() function and converting some
callers (including some of these allocations) over to it if they
either won't need to use their "struct index_state" again, or are just
about to call index_state_init().

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Acked-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason
2023-01-12 13:55:27 +01:00
committed by Junio C Hamano
parent 5bdf6d4ac0
commit 2f6b1eb794
12 changed files with 52 additions and 30 deletions

View File

@ -2490,9 +2490,10 @@ int read_index_from(struct index_state *istate, const char *path,
trace_performance_enter();
if (split_index->base)
discard_index(split_index->base);
release_index(split_index->base);
else
CALLOC_ARRAY(split_index->base, 1);
ALLOC_ARRAY(split_index->base, 1);
index_state_init(split_index->base);
base_oid_hex = oid_to_hex(&split_index->base_oid);
base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_oid_hex);
@ -2531,7 +2532,13 @@ int is_index_unborn(struct index_state *istate)
return (!istate->cache_nr && !istate->timestamp.sec);
}
void discard_index(struct index_state *istate)
void index_state_init(struct index_state *istate)
{
struct index_state blank = INDEX_STATE_INIT;
memcpy(istate, &blank, sizeof(*istate));
}
void release_index(struct index_state *istate)
{
/*
* Cache entries in istate->cache[] should have been allocated
@ -2543,20 +2550,12 @@ void discard_index(struct index_state *istate)
validate_cache_entries(istate);
resolve_undo_clear_index(istate);
istate->cache_nr = 0;
istate->cache_changed = 0;
istate->timestamp.sec = 0;
istate->timestamp.nsec = 0;
free_name_hash(istate);
cache_tree_free(&(istate->cache_tree));
istate->initialized = 0;
istate->fsmonitor_has_run_once = 0;
FREE_AND_NULL(istate->fsmonitor_last_update);
FREE_AND_NULL(istate->cache);
istate->cache_alloc = 0;
free(istate->fsmonitor_last_update);
free(istate->cache);
discard_split_index(istate);
free_untracked_cache(istate->untracked);
istate->untracked = NULL;
if (istate->sparse_checkout_patterns) {
clear_pattern_list(istate->sparse_checkout_patterns);
@ -2569,6 +2568,12 @@ void discard_index(struct index_state *istate)
}
}
void discard_index(struct index_state *istate)
{
release_index(istate);
index_state_init(istate);
}
/*
* Validate the cache entries of this index.
* All cache entries associated with this index