diff options
author | Alan Modra <amodra@gmail.com> | 2006-11-20 01:38:38 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2006-11-20 01:38:38 +0000 |
commit | 98f0b6ab8c1d2e1528a93e9e483f8d666243a67d (patch) | |
tree | 2f7079344fc8f631cbc8a938fb53005f2b916cab /bfd | |
parent | 98a16ee117073d28a8c6863e9c8d7e2575bc1736 (diff) | |
download | fsf-binutils-gdb-98f0b6ab8c1d2e1528a93e9e483f8d666243a67d.zip fsf-binutils-gdb-98f0b6ab8c1d2e1528a93e9e483f8d666243a67d.tar.gz fsf-binutils-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')
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/bfd-in.h | 14 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 14 | ||||
-rw-r--r-- | bfd/hash.c | 11 |
4 files changed, 32 insertions, 16 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 50c9853..bbd5459 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2006-11-20 Alan Modra <amodra@bigpond.net.au> + + 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. + 2006-11-18 Alan Modra <amodra@bigpond.net.au> * elflink.c (_bfd_elf_check_kept_section): Test for kept group diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index e671ee7..35ce396 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -398,12 +398,6 @@ struct bfd_hash_table { /* The hash array. */ struct bfd_hash_entry **table; - /* The number of slots in the hash table. */ - unsigned int size; - /* The number of entries in the hash table. */ - unsigned int count; - /* The size of elements. */ - unsigned int entsize; /* A function used to create new elements in the hash table. The first entry is itself a pointer to an element. When this function is first invoked, this pointer will be NULL. However, @@ -416,6 +410,14 @@ struct bfd_hash_table /* An objalloc for this hash table. This is a struct objalloc *, but we use void * to avoid requiring the inclusion of objalloc.h. */ void *memory; + /* The number of slots in the hash table. */ + unsigned int size; + /* The number of entries in the hash table. */ + unsigned int count; + /* The size of elements. */ + unsigned int entsize; + /* If non-zero, don't grow the hash table. */ + unsigned int frozen:1; }; /* Initialize a hash table. */ diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 8f2af8b..80eb8a2 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -405,12 +405,6 @@ struct bfd_hash_table { /* The hash array. */ struct bfd_hash_entry **table; - /* The number of slots in the hash table. */ - unsigned int size; - /* The number of entries in the hash table. */ - unsigned int count; - /* The size of elements. */ - unsigned int entsize; /* A function used to create new elements in the hash table. The first entry is itself a pointer to an element. When this function is first invoked, this pointer will be NULL. However, @@ -423,6 +417,14 @@ struct bfd_hash_table /* An objalloc for this hash table. This is a struct objalloc *, but we use void * to avoid requiring the inclusion of objalloc.h. */ void *memory; + /* The number of slots in the hash table. */ + unsigned int size; + /* The number of entries in the hash table. */ + unsigned int count; + /* The size of elements. */ + unsigned int entsize; + /* If non-zero, don't grow the hash table. */ + unsigned int frozen:1; }; /* Initialize a hash table. */ @@ -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 |