[PATCH v3 07/11] name-hash.c: remove unreferenced directory entries
- From
Karsten Blees <karsten.blees@gmail.com>
- Date
- Oct 1, 2013, 09:38 UTC
- Message-ID
- <524A9812.9070101@gmail.com>
- In-Reply-To
- <524A96FF.5090604@gmail.com>
The new hashmap implementation supports remove, so remove and free directory entries that are no longer referenced by active cache entries.
Signed-off-by: Karsten Blees <blees@dcon.de> --- name-hash.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/name-hash.c b/name-hash.c index aa57666..ce54fb3 100644 --- a/name-hash.c +++ b/name-hash.c @@ -85,15 +85,16 @@ static void add_dir_entry(struct index_state *istate, struct cache_entry *ce) static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce) { /* - * Release reference to the directory entry (and parents if 0). - * - * Note: we do not remove / free the entry because there's no - * hash.[ch]::remove_hash and dir->next may point to other entries - * that are still valid, so we must not free the memory. + * Release reference to the directory entry. If 0, remove and continue + * with parent directory. */ struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce)); - while (dir && dir->nr && !(--dir->nr)) - dir = dir->parent; + while (dir && !(--dir->nr)) { + struct dir_entry *parent = dir->parent; + hashmap_remove(&istate->dir_hash, dir, NULL); + free(dir); + dir = parent; + } } static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
-- 1.8.4.11.g4f52745.dirty