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:
Linus Torvalds 2008-02-22 20:39:21 -08:00 committed by Junio C Hamano
parent a22c637124
commit d070e3a31b
3 changed files with 17 additions and 16 deletions

View File

@ -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
View File

@ -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)

View File

@ -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)