make_transient_cache_entry(): optionally alloc from mem_pool

Allow make_transient_cache_entry() to optionally receive a mem_pool
struct in which it should allocate the entry. This will be used in the
following patch, to store some transient entries which should persist
until parallel checkout finishes.

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Matheus Tavares 2021-05-04 13:27:28 -03:00 committed by Junio C Hamano
parent 68e66f2987
commit 9616882780
6 changed files with 23 additions and 13 deletions

View File

@ -39,7 +39,7 @@ static void packet_to_pc_item(const char *buffer, int len,
} }


memset(pc_item, 0, sizeof(*pc_item)); memset(pc_item, 0, sizeof(*pc_item));
pc_item->ce = make_empty_transient_cache_entry(fixed_portion->name_len); pc_item->ce = make_empty_transient_cache_entry(fixed_portion->name_len, NULL);
pc_item->ce->ce_namelen = fixed_portion->name_len; pc_item->ce->ce_namelen = fixed_portion->name_len;
pc_item->ce->ce_mode = fixed_portion->ce_mode; pc_item->ce->ce_mode = fixed_portion->ce_mode;
memcpy(pc_item->ce->name, variant, pc_item->ce->ce_namelen); memcpy(pc_item->ce->name, variant, pc_item->ce->ce_namelen);

View File

@ -291,7 +291,7 @@ static int checkout_merged(int pos, const struct checkout *state, int *nr_checko
if (write_object_file(result_buf.ptr, result_buf.size, blob_type, &oid)) if (write_object_file(result_buf.ptr, result_buf.size, blob_type, &oid))
die(_("Unable to add merge result for '%s'"), path); die(_("Unable to add merge result for '%s'"), path);
free(result_buf.ptr); free(result_buf.ptr);
ce = make_transient_cache_entry(mode, &oid, path, 2); ce = make_transient_cache_entry(mode, &oid, path, 2, NULL);
if (!ce) if (!ce)
die(_("make_cache_entry failed for path '%s'"), path); die(_("make_cache_entry failed for path '%s'"), path);
status = checkout_entry(ce, state, NULL, nr_checkouts); status = checkout_entry(ce, state, NULL, nr_checkouts);

View File

@ -323,7 +323,7 @@ static int checkout_path(unsigned mode, struct object_id *oid,
struct cache_entry *ce; struct cache_entry *ce;
int ret; int ret;


ce = make_transient_cache_entry(mode, oid, path, 0); ce = make_transient_cache_entry(mode, oid, path, 0, NULL);
ret = checkout_entry(ce, state, NULL, NULL); ret = checkout_entry(ce, state, NULL, NULL);


discard_cache_entry(ce); discard_cache_entry(ce);

14
cache.h
View File

@ -356,16 +356,20 @@ struct cache_entry *make_empty_cache_entry(struct index_state *istate,
size_t name_len); size_t name_len);


/* /*
* Create a cache_entry that is not intended to be added to an index. * Create a cache_entry that is not intended to be added to an index. If
* Caller is responsible for discarding the cache_entry * `ce_mem_pool` is not NULL, the entry is allocated within the given memory
* with `discard_cache_entry`. * pool. Caller is responsible for discarding "loose" entries with
* `discard_cache_entry()` and the memory pool with
* `mem_pool_discard(ce_mem_pool, should_validate_cache_entries())`.
*/ */
struct cache_entry *make_transient_cache_entry(unsigned int mode, struct cache_entry *make_transient_cache_entry(unsigned int mode,
const struct object_id *oid, const struct object_id *oid,
const char *path, const char *path,
int stage); int stage,
struct mem_pool *ce_mem_pool);


struct cache_entry *make_empty_transient_cache_entry(size_t name_len); struct cache_entry *make_empty_transient_cache_entry(size_t len,
struct mem_pool *ce_mem_pool);


/* /*
* Discard cache entry. * Discard cache entry.

View File

@ -813,8 +813,11 @@ struct cache_entry *make_empty_cache_entry(struct index_state *istate, size_t le
return mem_pool__ce_calloc(find_mem_pool(istate), len); return mem_pool__ce_calloc(find_mem_pool(istate), len);
} }


struct cache_entry *make_empty_transient_cache_entry(size_t len) struct cache_entry *make_empty_transient_cache_entry(size_t len,
struct mem_pool *ce_mem_pool)
{ {
if (ce_mem_pool)
return mem_pool__ce_calloc(ce_mem_pool, len);
return xcalloc(1, cache_entry_size(len)); return xcalloc(1, cache_entry_size(len));
} }


@ -848,8 +851,11 @@ struct cache_entry *make_cache_entry(struct index_state *istate,
return ret; return ret;
} }


struct cache_entry *make_transient_cache_entry(unsigned int mode, const struct object_id *oid, struct cache_entry *make_transient_cache_entry(unsigned int mode,
const char *path, int stage) const struct object_id *oid,
const char *path,
int stage,
struct mem_pool *ce_mem_pool)
{ {
struct cache_entry *ce; struct cache_entry *ce;
int len; int len;
@ -860,7 +866,7 @@ struct cache_entry *make_transient_cache_entry(unsigned int mode, const struct o
} }


len = strlen(path); len = strlen(path);
ce = make_empty_transient_cache_entry(len); ce = make_empty_transient_cache_entry(len, ce_mem_pool);


oidcpy(&ce->oid, oid); oidcpy(&ce->oid, oid);
memcpy(ce->name, path, len); memcpy(ce->name, path, len);

View File

@ -1034,7 +1034,7 @@ static struct cache_entry *create_ce_entry(const struct traverse_info *info,
size_t len = traverse_path_len(info, tree_entry_len(n)); size_t len = traverse_path_len(info, tree_entry_len(n));
struct cache_entry *ce = struct cache_entry *ce =
is_transient ? is_transient ?
make_empty_transient_cache_entry(len) : make_empty_transient_cache_entry(len, NULL) :
make_empty_cache_entry(istate, len); make_empty_cache_entry(istate, len);


ce->ce_mode = create_ce_mode(n->mode); ce->ce_mode = create_ce_mode(n->mode);