aboutsummaryrefslogtreecommitdiff
path: root/bfd/hash.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2006-11-20 01:38:38 +0000
committerAlan Modra <amodra@gmail.com>2006-11-20 01:38:38 +0000
commit98f0b6ab8c1d2e1528a93e9e483f8d666243a67d (patch)
tree2f7079344fc8f631cbc8a938fb53005f2b916cab /bfd/hash.c
parent98a16ee117073d28a8c6863e9c8d7e2575bc1736 (diff)
downloadgdb-98f0b6ab8c1d2e1528a93e9e483f8d666243a67d.zip
gdb-98f0b6ab8c1d2e1528a93e9e483f8d666243a67d.tar.gz
gdb-98f0b6ab8c1d2e1528a93e9e483f8d666243a67d.tar.bz2
PR 3532
* bfd-in.h (struct bfd_hash_table): Reorganize. Add "frozen". * hash.c (bfd_hash_table_init_n): Init frozen. (bfd_hash_lookup): Don't grow if frozen. (bfd_hash_traverse): Freeze hash table during traversal. * bfd-in2.h: Regenerate.
Diffstat (limited to 'bfd/hash.c')
-rw-r--r--bfd/hash.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/bfd/hash.c b/bfd/hash.c
index 3cc4f79..1157980 100644
--- a/bfd/hash.c
+++ b/bfd/hash.c
@@ -383,6 +383,7 @@ bfd_hash_table_init_n (struct bfd_hash_table *table,
table->size = size;
table->entsize = entsize;
table->count = 0;
+ table->frozen = 0;
table->newfunc = newfunc;
return TRUE;
}
@@ -471,7 +472,7 @@ bfd_hash_lookup (struct bfd_hash_table *table,
table->table[index] = hashp;
table->count++;
- if (table->count > table->size * 3 / 4)
+ if (!table->frozen && table->count > table->size * 3 / 4)
{
unsigned long newsize = higher_prime_number (table->size);
struct bfd_hash_entry **newtable;
@@ -482,8 +483,7 @@ bfd_hash_lookup (struct bfd_hash_table *table,
that much memory, don't try to grow the table. */
if (newsize == 0 || alloc / sizeof (struct bfd_hash_entry *) != newsize)
{
- /* Lie. Stops us trying to grow again for a while. */
- table->count = 0;
+ table->frozen = 1;
return hashp;
}
@@ -573,14 +573,17 @@ bfd_hash_traverse (struct bfd_hash_table *table,
{
unsigned int i;
+ table->frozen = 1;
for (i = 0; i < table->size; i++)
{
struct bfd_hash_entry *p;
for (p = table->table[i]; p != NULL; p = p->next)
if (! (*func) (p, info))
- return;
+ goto out;
}
+ out:
+ table->frozen = 0;
}
void