mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 15:33:56 +00:00
hash: force size to be a power of 2
By forcing the hash table size to be a power of 2, a potentially expensive divide can be replaced by a mask operation. Almost all usage of the hash table was using default size of 1024. Only places with different size was thread library (1011) and bgp aspath. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
44a86a0278
commit
90645f5598
@ -1856,7 +1856,7 @@ aspath_cmp (const void *arg1, const void *arg2)
|
|||||||
void
|
void
|
||||||
aspath_init (void)
|
aspath_init (void)
|
||||||
{
|
{
|
||||||
ashash = hash_create_size (32767, aspath_key_make, aspath_cmp);
|
ashash = hash_create_size (32768, aspath_key_make, aspath_cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -31,6 +31,7 @@ hash_create_size (unsigned int size, unsigned int (*hash_key) (void *),
|
|||||||
{
|
{
|
||||||
struct hash *hash;
|
struct hash *hash;
|
||||||
|
|
||||||
|
assert ((size & (size-1)) == 0);
|
||||||
hash = XMALLOC (MTYPE_HASH, sizeof (struct hash));
|
hash = XMALLOC (MTYPE_HASH, sizeof (struct hash));
|
||||||
hash->index = XCALLOC (MTYPE_HASH_INDEX,
|
hash->index = XCALLOC (MTYPE_HASH_INDEX,
|
||||||
sizeof (struct hash_backet *) * size);
|
sizeof (struct hash_backet *) * size);
|
||||||
@ -71,7 +72,7 @@ hash_get (struct hash *hash, void *data, void * (*alloc_func) (void *))
|
|||||||
struct hash_backet *backet;
|
struct hash_backet *backet;
|
||||||
|
|
||||||
key = (*hash->hash_key) (data);
|
key = (*hash->hash_key) (data);
|
||||||
index = key % hash->size;
|
index = key & (hash->size - 1);
|
||||||
|
|
||||||
for (backet = hash->index[index]; backet != NULL; backet = backet->next)
|
for (backet = hash->index[index]; backet != NULL; backet = backet->next)
|
||||||
if (backet->key == key && (*hash->hash_cmp) (backet->data, data))
|
if (backet->key == key && (*hash->hash_cmp) (backet->data, data))
|
||||||
@ -125,7 +126,7 @@ hash_release (struct hash *hash, void *data)
|
|||||||
struct hash_backet *pp;
|
struct hash_backet *pp;
|
||||||
|
|
||||||
key = (*hash->hash_key) (data);
|
key = (*hash->hash_key) (data);
|
||||||
index = key % hash->size;
|
index = key & (hash->size - 1);
|
||||||
|
|
||||||
for (backet = pp = hash->index[index]; backet; backet = backet->next)
|
for (backet = pp = hash->index[index]; backet; backet = backet->next)
|
||||||
{
|
{
|
||||||
|
@ -41,7 +41,7 @@ struct hash
|
|||||||
/* Hash backet. */
|
/* Hash backet. */
|
||||||
struct hash_backet **index;
|
struct hash_backet **index;
|
||||||
|
|
||||||
/* Hash table size. */
|
/* Hash table size. Must be power of 2 */
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
|
||||||
/* Key make function. */
|
/* Key make function. */
|
||||||
|
@ -531,8 +531,8 @@ thread_master_create ()
|
|||||||
{
|
{
|
||||||
if (cpu_record == NULL)
|
if (cpu_record == NULL)
|
||||||
cpu_record
|
cpu_record
|
||||||
= hash_create_size (1011, (unsigned int (*) (void *))cpu_record_hash_key,
|
= hash_create ((unsigned int (*) (void *))cpu_record_hash_key,
|
||||||
(int (*) (const void *, const void *))cpu_record_hash_cmp);
|
(int (*) (const void *, const void *))cpu_record_hash_cmp);
|
||||||
|
|
||||||
return (struct thread_master *) XCALLOC (MTYPE_THREAD_MASTER,
|
return (struct thread_master *) XCALLOC (MTYPE_THREAD_MASTER,
|
||||||
sizeof (struct thread_master));
|
sizeof (struct thread_master));
|
||||||
|
Loading…
Reference in New Issue
Block a user