about summary refs log tree commit diff
path: root/third_party/git/name-hash.c
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-05-25T23·06+0100
committerVincent Ambo <tazjin@google.com>2020-05-25T23·06+0100
commit93ba78d6f4632ef1c5228965e3edc8c0faf88c1e (patch)
tree85730c182a9f5f492ade8e8ccdb1c2356f9900bd /third_party/git/name-hash.c
parent6f8fbf4aa4b1654ab27d4829e114538761817de0 (diff)
revert(3p/git): Revert merge of git upstream at v2.26.2 r/852
This causes cgit to serve error pages, which is undesirable.

This reverts commit 5229c9b232de5bfa959ad6ebbb4c8192ac513352, reversing
changes made to f2b211131f2347342dde63975b09cf603149f1a3.
Diffstat (limited to 'third_party/git/name-hash.c')
-rw-r--r--third_party/git/name-hash.c61
1 files changed, 28 insertions, 33 deletions
diff --git a/third_party/git/name-hash.c b/third_party/git/name-hash.c
index fb526a3775..695908609f 100644
--- a/third_party/git/name-hash.c
+++ b/third_party/git/name-hash.c
@@ -17,16 +17,14 @@ struct dir_entry {
 };
 
 static int dir_entry_cmp(const void *unused_cmp_data,
-			 const struct hashmap_entry *eptr,
-			 const struct hashmap_entry *entry_or_key,
+			 const void *entry,
+			 const void *entry_or_key,
 			 const void *keydata)
 {
-	const struct dir_entry *e1, *e2;
+	const struct dir_entry *e1 = entry;
+	const struct dir_entry *e2 = entry_or_key;
 	const char *name = keydata;
 
-	e1 = container_of(eptr, const struct dir_entry, ent);
-	e2 = container_of(entry_or_key, const struct dir_entry, ent);
-
 	return e1->namelen != e2->namelen || strncasecmp(e1->name,
 			name ? name : e2->name, e1->namelen);
 }
@@ -35,9 +33,9 @@ static struct dir_entry *find_dir_entry__hash(struct index_state *istate,
 		const char *name, unsigned int namelen, unsigned int hash)
 {
 	struct dir_entry key;
-	hashmap_entry_init(&key.ent, hash);
+	hashmap_entry_init(&key, hash);
 	key.namelen = namelen;
-	return hashmap_get_entry(&istate->dir_hash, &key, ent, name);
+	return hashmap_get(&istate->dir_hash, &key, name);
 }
 
 static struct dir_entry *find_dir_entry(struct index_state *istate,
@@ -70,9 +68,9 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate,
 	if (!dir) {
 		/* not found, create it and add to hash table */
 		FLEX_ALLOC_MEM(dir, name, ce->name, namelen);
-		hashmap_entry_init(&dir->ent, memihash(ce->name, namelen));
+		hashmap_entry_init(dir, memihash(ce->name, namelen));
 		dir->namelen = namelen;
-		hashmap_add(&istate->dir_hash, &dir->ent);
+		hashmap_add(&istate->dir_hash, dir);
 
 		/* recursively add missing parent directories */
 		dir->parent = hash_dir_entry(istate, ce, namelen);
@@ -97,7 +95,7 @@ static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce)
 	struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce));
 	while (dir && !(--dir->nr)) {
 		struct dir_entry *parent = dir->parent;
-		hashmap_remove(&istate->dir_hash, &dir->ent, NULL);
+		hashmap_remove(&istate->dir_hash, dir, NULL);
 		free(dir);
 		dir = parent;
 	}
@@ -108,23 +106,20 @@ static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
 	if (ce->ce_flags & CE_HASHED)
 		return;
 	ce->ce_flags |= CE_HASHED;
-	hashmap_entry_init(&ce->ent, memihash(ce->name, ce_namelen(ce)));
-	hashmap_add(&istate->name_hash, &ce->ent);
+	hashmap_entry_init(ce, memihash(ce->name, ce_namelen(ce)));
+	hashmap_add(&istate->name_hash, ce);
 
 	if (ignore_case)
 		add_dir_entry(istate, ce);
 }
 
 static int cache_entry_cmp(const void *unused_cmp_data,
-			   const struct hashmap_entry *eptr,
-			   const struct hashmap_entry *entry_or_key,
+			   const void *entry,
+			   const void *entry_or_key,
 			   const void *remove)
 {
-	const struct cache_entry *ce1, *ce2;
-
-	ce1 = container_of(eptr, const struct cache_entry, ent);
-	ce2 = container_of(entry_or_key, const struct cache_entry, ent);
-
+	const struct cache_entry *ce1 = entry;
+	const struct cache_entry *ce2 = entry_or_key;
 	/*
 	 * For remove_name_hash, find the exact entry (pointer equality); for
 	 * index_file_exists, find all entries with matching hash code and
@@ -138,7 +133,7 @@ static int lazy_nr_dir_threads;
 
 /*
  * Set a minimum number of cache_entries that we will handle per
- * thread and use that to decide how many threads to run (up to
+ * thread and use that to decide how many threads to run (upto
  * the number on the system).
  *
  * For guidance setting the lower per-thread bound, see:
@@ -218,7 +213,7 @@ static int lookup_lazy_params(struct index_state *istate)
  * However, the hashmap is going to put items into bucket
  * chains based on their hash values.  Use that to create n
  * mutexes and lock on mutex[bucket(hash) % n].  This will
- * decrease the collision rate by (hopefully) a factor of n.
+ * decrease the collision rate by (hopefully) by a factor of n.
  */
 static void init_dir_mutex(void)
 {
@@ -285,10 +280,10 @@ static struct dir_entry *hash_dir_entry_with_parent_and_prefix(
 	dir = find_dir_entry__hash(istate, prefix->buf, prefix->len, hash);
 	if (!dir) {
 		FLEX_ALLOC_MEM(dir, name, prefix->buf, prefix->len);
-		hashmap_entry_init(&dir->ent, hash);
+		hashmap_entry_init(dir, hash);
 		dir->namelen = prefix->len;
 		dir->parent = parent;
-		hashmap_add(&istate->dir_hash, &dir->ent);
+		hashmap_add(&istate->dir_hash, dir);
 
 		if (parent) {
 			unlock_dir_mutex(lock_nr);
@@ -477,8 +472,8 @@ static void *lazy_name_thread_proc(void *_data)
 	for (k = 0; k < d->istate->cache_nr; k++) {
 		struct cache_entry *ce_k = d->istate->cache[k];
 		ce_k->ce_flags |= CE_HASHED;
-		hashmap_entry_init(&ce_k->ent, d->lazy_entries[k].hash_name);
-		hashmap_add(&d->istate->name_hash, &ce_k->ent);
+		hashmap_entry_init(ce_k, d->lazy_entries[k].hash_name);
+		hashmap_add(&d->istate->name_hash, ce_k);
 	}
 
 	return NULL;
@@ -630,7 +625,7 @@ void remove_name_hash(struct index_state *istate, struct cache_entry *ce)
 	if (!istate->name_hash_initialized || !(ce->ce_flags & CE_HASHED))
 		return;
 	ce->ce_flags &= ~CE_HASHED;
-	hashmap_remove(&istate->name_hash, &ce->ent, ce);
+	hashmap_remove(&istate->name_hash, ce, ce);
 
 	if (ignore_case)
 		remove_dir_entry(istate, ce);
@@ -707,15 +702,15 @@ void adjust_dirname_case(struct index_state *istate, char *name)
 struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
 {
 	struct cache_entry *ce;
-	unsigned int hash = memihash(name, namelen);
 
 	lazy_init_name_hash(istate);
 
-	ce = hashmap_get_entry_from_hash(&istate->name_hash, hash, NULL,
-					 struct cache_entry, ent);
-	hashmap_for_each_entry_from(&istate->name_hash, ce, ent) {
+	ce = hashmap_get_from_hash(&istate->name_hash,
+				   memihash(name, namelen), NULL);
+	while (ce) {
 		if (same_name(ce, name, namelen, icase))
 			return ce;
+		ce = hashmap_get_next(&istate->name_hash, ce);
 	}
 	return NULL;
 }
@@ -726,6 +721,6 @@ void free_name_hash(struct index_state *istate)
 		return;
 	istate->name_hash_initialized = 0;
 
-	hashmap_free(&istate->name_hash);
-	hashmap_free_entries(&istate->dir_hash, struct dir_entry, ent);
+	hashmap_free(&istate->name_hash, 0);
+	hashmap_free(&istate->dir_hash, 1);
 }