Name hash fixups: export (and rename) remove_hash_entry
This makes the name hash removal function (which really just sets the bit that disables lookups of it) available to external routines, and makes read_cache_unmerged() use it when it drops an unmerged entry from the index. It's renamed to remove_index_entry(), and we drop the (unused) 'istate' argument. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a22c637124
commit
d070e3a31b
@ -41,6 +41,7 @@ static int read_cache_unmerged(void)
|
|||||||
for (i = 0; i < active_nr; i++) {
|
for (i = 0; i < active_nr; i++) {
|
||||||
struct cache_entry *ce = active_cache[i];
|
struct cache_entry *ce = active_cache[i];
|
||||||
if (ce_stage(ce)) {
|
if (ce_stage(ce)) {
|
||||||
|
remove_index_entry(ce);
|
||||||
if (last && !strcmp(ce->name, last->name))
|
if (last && !strcmp(ce->name, last->name))
|
||||||
continue;
|
continue;
|
||||||
cache_tree_invalidate_path(active_cache_tree, ce->name);
|
cache_tree_invalidate_path(active_cache_tree, ce->name);
|
||||||
|
14
cache.h
14
cache.h
@ -137,6 +137,20 @@ struct cache_entry {
|
|||||||
#define CE_HASHED (0x100000)
|
#define CE_HASHED (0x100000)
|
||||||
#define CE_UNHASHED (0x200000)
|
#define CE_UNHASHED (0x200000)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't actually *remove* it, we can just mark it invalid so that
|
||||||
|
* we won't find it in lookups.
|
||||||
|
*
|
||||||
|
* Not only would we have to search the lists (simple enough), but
|
||||||
|
* we'd also have to rehash other hash buckets in case this makes the
|
||||||
|
* hash bucket empty (common). So it's much better to just mark
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
static inline void remove_index_entry(struct cache_entry *ce)
|
||||||
|
{
|
||||||
|
ce->ce_flags |= CE_UNHASHED;
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned create_ce_flags(size_t len, unsigned stage)
|
static inline unsigned create_ce_flags(size_t len, unsigned stage)
|
||||||
{
|
{
|
||||||
if (len >= CE_NAMEMASK)
|
if (len >= CE_NAMEMASK)
|
||||||
|
18
read-cache.c
18
read-cache.c
@ -70,25 +70,11 @@ static void set_index_entry(struct index_state *istate, int nr, struct cache_ent
|
|||||||
hash_index_entry(istate, ce);
|
hash_index_entry(istate, ce);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We don't actually *remove* it, we can just mark it invalid so that
|
|
||||||
* we won't find it in lookups.
|
|
||||||
*
|
|
||||||
* Not only would we have to search the lists (simple enough), but
|
|
||||||
* we'd also have to rehash other hash buckets in case this makes the
|
|
||||||
* hash bucket empty (common). So it's much better to just mark
|
|
||||||
* it.
|
|
||||||
*/
|
|
||||||
static void remove_hash_entry(struct index_state *istate, struct cache_entry *ce)
|
|
||||||
{
|
|
||||||
ce->ce_flags |= CE_UNHASHED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void replace_index_entry(struct index_state *istate, int nr, struct cache_entry *ce)
|
static void replace_index_entry(struct index_state *istate, int nr, struct cache_entry *ce)
|
||||||
{
|
{
|
||||||
struct cache_entry *old = istate->cache[nr];
|
struct cache_entry *old = istate->cache[nr];
|
||||||
|
|
||||||
remove_hash_entry(istate, old);
|
remove_index_entry(old);
|
||||||
set_index_entry(istate, nr, ce);
|
set_index_entry(istate, nr, ce);
|
||||||
istate->cache_changed = 1;
|
istate->cache_changed = 1;
|
||||||
}
|
}
|
||||||
@ -417,7 +403,7 @@ int remove_index_entry_at(struct index_state *istate, int pos)
|
|||||||
{
|
{
|
||||||
struct cache_entry *ce = istate->cache[pos];
|
struct cache_entry *ce = istate->cache[pos];
|
||||||
|
|
||||||
remove_hash_entry(istate, ce);
|
remove_index_entry(ce);
|
||||||
istate->cache_changed = 1;
|
istate->cache_changed = 1;
|
||||||
istate->cache_nr--;
|
istate->cache_nr--;
|
||||||
if (pos >= istate->cache_nr)
|
if (pos >= istate->cache_nr)
|
||||||
|
Loading…
Reference in New Issue
Block a user