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>maint
							parent
							
								
									5bdf6d4ac0
								
							
						
					
					
						commit
						2f6b1eb794
					
				
							
								
								
									
										2
									
								
								apply.c
								
								
								
								
							
							
						
						
									
										2
									
								
								apply.c
								
								
								
								
							|  | @ -4105,7 +4105,7 @@ static int preimage_oid_in_gitlink_patch(struct patch *p, struct object_id *oid) | |||
| static int build_fake_ancestor(struct apply_state *state, struct patch *list) | ||||
| { | ||||
| 	struct patch *patch; | ||||
| 	struct index_state result = { NULL }; | ||||
| 	struct index_state result = INDEX_STATE_INIT; | ||||
| 	struct lock_file lock = LOCK_INIT; | ||||
| 	int res; | ||||
|  | ||||
|  |  | |||
|  | @ -361,7 +361,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix, | |||
| 	struct hashmap symlinks2 = HASHMAP_INIT(pair_cmp, NULL); | ||||
| 	struct hashmap_iter iter; | ||||
| 	struct pair_entry *entry; | ||||
| 	struct index_state wtindex = { 0 }; | ||||
| 	struct index_state wtindex = INDEX_STATE_INIT; | ||||
| 	struct checkout lstate, rstate; | ||||
| 	int err = 0; | ||||
| 	struct child_process cmd = CHILD_PROCESS_INIT; | ||||
|  |  | |||
|  | @ -217,6 +217,7 @@ static int update_working_directory(struct pattern_list *pl) | |||
| 	o.head_idx = -1; | ||||
| 	o.src_index = r->index; | ||||
| 	o.dst_index = r->index; | ||||
| 	index_state_init(&o.result); | ||||
| 	o.skip_sparse_checkout = 0; | ||||
| 	o.pl = pl; | ||||
|  | ||||
|  |  | |||
|  | @ -1137,7 +1137,7 @@ static int save_untracked_files(struct stash_info *info, struct strbuf *msg, | |||
| 	int ret = 0; | ||||
| 	struct strbuf untracked_msg = STRBUF_INIT; | ||||
| 	struct child_process cp_upd_index = CHILD_PROCESS_INIT; | ||||
| 	struct index_state istate = { NULL }; | ||||
| 	struct index_state istate = INDEX_STATE_INIT; | ||||
|  | ||||
| 	cp_upd_index.git_cmd = 1; | ||||
| 	strvec_pushl(&cp_upd_index.args, "update-index", "-z", "--add", | ||||
|  | @ -1165,7 +1165,7 @@ static int save_untracked_files(struct stash_info *info, struct strbuf *msg, | |||
| 	} | ||||
|  | ||||
| done: | ||||
| 	discard_index(&istate); | ||||
| 	release_index(&istate); | ||||
| 	strbuf_release(&untracked_msg); | ||||
| 	remove_path(stash_index_path.buf); | ||||
| 	return ret; | ||||
|  | @ -1176,7 +1176,7 @@ static int stash_staged(struct stash_info *info, struct strbuf *out_patch, | |||
| { | ||||
| 	int ret = 0; | ||||
| 	struct child_process cp_diff_tree = CHILD_PROCESS_INIT; | ||||
| 	struct index_state istate = { NULL }; | ||||
| 	struct index_state istate = INDEX_STATE_INIT; | ||||
|  | ||||
| 	if (write_index_as_tree(&info->w_tree, &istate, the_repository->index_file, | ||||
| 				0, NULL)) { | ||||
|  | @ -1199,7 +1199,7 @@ static int stash_staged(struct stash_info *info, struct strbuf *out_patch, | |||
| 	} | ||||
|  | ||||
| done: | ||||
| 	discard_index(&istate); | ||||
| 	release_index(&istate); | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
|  | @ -1209,7 +1209,7 @@ static int stash_patch(struct stash_info *info, const struct pathspec *ps, | |||
| 	int ret = 0; | ||||
| 	struct child_process cp_read_tree = CHILD_PROCESS_INIT; | ||||
| 	struct child_process cp_diff_tree = CHILD_PROCESS_INIT; | ||||
| 	struct index_state istate = { NULL }; | ||||
| 	struct index_state istate = INDEX_STATE_INIT; | ||||
| 	char *old_index_env = NULL, *old_repo_index_file; | ||||
|  | ||||
| 	remove_path(stash_index_path.buf); | ||||
|  | @ -1260,7 +1260,7 @@ static int stash_patch(struct stash_info *info, const struct pathspec *ps, | |||
| 	} | ||||
|  | ||||
| done: | ||||
| 	discard_index(&istate); | ||||
| 	release_index(&istate); | ||||
| 	remove_path(stash_index_path.buf); | ||||
| 	return ret; | ||||
| } | ||||
|  | @ -1271,7 +1271,7 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps | |||
| 	struct rev_info rev; | ||||
| 	struct child_process cp_upd_index = CHILD_PROCESS_INIT; | ||||
| 	struct strbuf diff_output = STRBUF_INIT; | ||||
| 	struct index_state istate = { NULL }; | ||||
| 	struct index_state istate = INDEX_STATE_INIT; | ||||
|  | ||||
| 	init_revisions(&rev, NULL); | ||||
| 	copy_pathspec(&rev.prune_data, ps); | ||||
|  | @ -1319,7 +1319,7 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps | |||
| 	} | ||||
|  | ||||
| done: | ||||
| 	discard_index(&istate); | ||||
| 	release_index(&istate); | ||||
| 	release_revisions(&rev); | ||||
| 	strbuf_release(&diff_output); | ||||
| 	remove_path(stash_index_path.buf); | ||||
|  |  | |||
|  | @ -923,7 +923,7 @@ static int unlock_worktree(int ac, const char **av, const char *prefix) | |||
|  | ||||
| static void validate_no_submodules(const struct worktree *wt) | ||||
| { | ||||
| 	struct index_state istate = { NULL }; | ||||
| 	struct index_state istate = INDEX_STATE_INIT; | ||||
| 	struct strbuf path = STRBUF_INIT; | ||||
| 	int i, found_submodules = 0; | ||||
|  | ||||
|  |  | |||
							
								
								
									
										13
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										13
									
								
								cache.h
								
								
								
								
							|  | @ -360,6 +360,19 @@ struct index_state { | |||
| 	struct pattern_list *sparse_checkout_patterns; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * A "struct index_state istate" must be initialized with | ||||
|  * INDEX_STATE_INIT or the corresponding index_state_init(). | ||||
|  * | ||||
|  * If the variable won't be used again, use release_index() to free() | ||||
|  * its resources. If it needs to be used again use discard_index(), | ||||
|  * which does the same thing, but will use use index_state_init() at | ||||
|  * the end. | ||||
|  */ | ||||
| #define INDEX_STATE_INIT { 0 } | ||||
| void index_state_init(struct index_state *istate); | ||||
| void release_index(struct index_state *istate); | ||||
|  | ||||
| /* Name hashing */ | ||||
| int test_lazy_init_name_hash(struct index_state *istate, int try_threaded); | ||||
| void add_name_hash(struct index_state *istate, struct cache_entry *ce); | ||||
|  |  | |||
|  | @ -412,7 +412,7 @@ static int unpack_trees_start(struct merge_options *opt, | |||
| { | ||||
| 	int rc; | ||||
| 	struct tree_desc t[3]; | ||||
| 	struct index_state tmp_index = { NULL }; | ||||
| 	struct index_state tmp_index = INDEX_STATE_INIT; | ||||
|  | ||||
| 	memset(&opt->priv->unpack_opts, 0, sizeof(opt->priv->unpack_opts)); | ||||
| 	if (opt->priv->call_depth) | ||||
|  |  | |||
							
								
								
									
										31
									
								
								read-cache.c
								
								
								
								
							
							
						
						
									
										31
									
								
								read-cache.c
								
								
								
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -302,8 +302,10 @@ int repo_read_index(struct repository *repo) | |||
| { | ||||
| 	int res; | ||||
|  | ||||
| 	if (!repo->index) | ||||
| 		CALLOC_ARRAY(repo->index, 1); | ||||
| 	if (!repo->index) { | ||||
| 		ALLOC_ARRAY(repo->index, 1); | ||||
| 		index_state_init(repo->index); | ||||
| 	} | ||||
|  | ||||
| 	/* Complete the double-reference */ | ||||
| 	if (!repo->index->repo) | ||||
|  |  | |||
|  | @ -1813,7 +1813,7 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) | |||
| 	worktrees = get_worktrees(); | ||||
| 	for (p = worktrees; *p; p++) { | ||||
| 		struct worktree *wt = *p; | ||||
| 		struct index_state istate = { NULL }; | ||||
| 		struct index_state istate = INDEX_STATE_INIT; | ||||
|  | ||||
| 		if (wt->is_current) | ||||
| 			continue; /* current index already taken care of */ | ||||
|  |  | |||
|  | @ -90,7 +90,8 @@ void move_cache_to_base_index(struct index_state *istate) | |||
| 		mem_pool_combine(istate->ce_mem_pool, istate->split_index->base->ce_mem_pool); | ||||
| 	} | ||||
|  | ||||
| 	CALLOC_ARRAY(si->base, 1); | ||||
| 	ALLOC_ARRAY(si->base, 1); | ||||
| 	index_state_init(si->base); | ||||
| 	si->base->version = istate->version; | ||||
| 	/* zero timestamp disables racy test in ce_write_index() */ | ||||
| 	si->base->timestamp = istate->timestamp; | ||||
|  |  | |||
|  | @ -1905,7 +1905,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options | |||
| 		populate_from_existing_patterns(o, &pl); | ||||
| 	} | ||||
|  | ||||
| 	memset(&o->result, 0, sizeof(o->result)); | ||||
| 	index_state_init(&o->result); | ||||
| 	o->result.initialized = 1; | ||||
| 	o->result.timestamp.sec = o->src_index->timestamp.sec; | ||||
| 	o->result.timestamp.nsec = o->src_index->timestamp.nsec; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Ævar Arnfjörð Bjarmason
						Ævar Arnfjörð Bjarmason