diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | elf/dl-misc.c | 64 | ||||
-rw-r--r-- | include/inline-hashtab.h | 72 |
3 files changed, 74 insertions, 69 deletions
@@ -1,3 +1,10 @@ +2009-07-07 Ulrich Drepper <drepper@redhat.com> + + * elf/dl-misc.c (_dl_higher_prime_number): New function. Moved here + from... + * include/inline-hashtab.h: ...here. + (htab_expand): Adjust for renamed function. Correct memory handling. + 2009-07-06 Ulrich Drepper <drepper@redhat.com> * elf/do-lookup.h (ALLOWED_STT): Optimize test for valid symbol types. diff --git a/elf/dl-misc.c b/elf/dl-misc.c index 7c77cd0..7d4e1a1 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -312,3 +312,67 @@ _dl_name_match_p (const char *name, const struct link_map *map) return 0; } + + +unsigned long int +_dl_higher_prime_number (unsigned long int n) +{ + /* These are primes that are near, but slightly smaller than, a + power of two. */ + static const uint32_t primes[] = { + UINT32_C (7), + UINT32_C (13), + UINT32_C (31), + UINT32_C (61), + UINT32_C (127), + UINT32_C (251), + UINT32_C (509), + UINT32_C (1021), + UINT32_C (2039), + UINT32_C (4093), + UINT32_C (8191), + UINT32_C (16381), + UINT32_C (32749), + UINT32_C (65521), + UINT32_C (131071), + UINT32_C (262139), + UINT32_C (524287), + UINT32_C (1048573), + UINT32_C (2097143), + UINT32_C (4194301), + UINT32_C (8388593), + UINT32_C (16777213), + UINT32_C (33554393), + UINT32_C (67108859), + UINT32_C (134217689), + UINT32_C (268435399), + UINT32_C (536870909), + UINT32_C (1073741789), + UINT32_C (2147483647), + /* 4294967291L */ + UINT32_C (2147483647) + UINT32_C (2147483644) + }; + + const uint32_t *low = &primes[0]; + const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])]; + + while (low != high) + { + const uint32_t *mid = low + (high - low) / 2; + if (n > *mid) + low = mid + 1; + else + high = mid; + } + +#if 0 + /* If we've run out of primes, abort. */ + if (n > *low) + { + fprintf (stderr, "Cannot find prime bigger than %lu\n", n); + abort (); + } +#endif + + return *low; +} diff --git a/include/inline-hashtab.h b/include/inline-hashtab.h index c359161..0f6719b 100644 --- a/include/inline-hashtab.h +++ b/include/inline-hashtab.h @@ -1,7 +1,5 @@ /* Fully-inline hash table, used mainly for managing TLS descriptors. - - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005, 2008 - Free Software Foundation, Inc. + Copyright (C) 1999-2003, 2005, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Alexandre Oliva <aoliva@redhat.com> @@ -30,69 +28,6 @@ extern void weak_function free (void *ptr); -inline static unsigned long -higher_prime_number (unsigned long n) -{ - /* These are primes that are near, but slightly smaller than, a - power of two. */ - static const uint32_t primes[] = { - UINT32_C (7), - UINT32_C (13), - UINT32_C (31), - UINT32_C (61), - UINT32_C (127), - UINT32_C (251), - UINT32_C (509), - UINT32_C (1021), - UINT32_C (2039), - UINT32_C (4093), - UINT32_C (8191), - UINT32_C (16381), - UINT32_C (32749), - UINT32_C (65521), - UINT32_C (131071), - UINT32_C (262139), - UINT32_C (524287), - UINT32_C (1048573), - UINT32_C (2097143), - UINT32_C (4194301), - UINT32_C (8388593), - UINT32_C (16777213), - UINT32_C (33554393), - UINT32_C (67108859), - UINT32_C (134217689), - UINT32_C (268435399), - UINT32_C (536870909), - UINT32_C (1073741789), - UINT32_C (2147483647), - /* 4294967291L */ - UINT32_C (2147483647) + UINT32_C (2147483644) - }; - - const uint32_t *low = &primes[0]; - const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])]; - - while (low != high) - { - const uint32_t *mid = low + (high - low) / 2; - if (n > *mid) - low = mid + 1; - else - high = mid; - } - -#if 0 - /* If we've run out of primes, abort. */ - if (n > *low) - { - fprintf (stderr, "Cannot find prime bigger than %lu\n", n); - abort (); - } -#endif - - return *low; -} - struct hashtab { /* Table itself. */ @@ -203,12 +138,11 @@ htab_expand (struct hashtab *htab, int (*hash_fn) (void *)) /* Resize only when table after removal of unused elements is either too full or too empty. */ if (htab->n_elements * 2 > htab->size) - nsize = higher_prime_number (htab->n_elements * 2); + nsize = _dl_higher_prime_number (htab->n_elements * 2); else nsize = htab->size; - nentries = malloc (sizeof (void *) * nsize); - memset (nentries, 0, sizeof (void *) * nsize); + nentries = calloc (sizeof (void *), nsize); if (nentries == NULL) return 0; htab->entries = nentries; |