lib: A small optimization for the hash iterate and walk functions

When we are iterating through the hash, keep count of how many
we've called and if we have finished calling the hash->size
iterator times, then short-circuit and stop looping over
the entire array.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-06-16 19:27:41 -04:00
parent 8872626bb4
commit 626e8d0a9b
2 changed files with 11 additions and 2 deletions

View File

@ -241,14 +241,20 @@ void hash_iterate(struct hash *hash, void (*func)(struct hash_backet *, void *),
unsigned int i;
struct hash_backet *hb;
struct hash_backet *hbnext;
uint32_t count = 0;
for (i = 0; i < hash->size; i++)
for (i = 0; i < hash->size; i++) {
for (hb = hash->index[i]; hb; hb = hbnext) {
/* get pointer to next hash backet here, in case (*func)
* decides to delete hb by calling hash_release
*/
hbnext = hb->next;
(*func)(hb, arg);
count++;
}
if (count == hash->count)
return;
}
}
@ -259,6 +265,7 @@ void hash_walk(struct hash *hash, int (*func)(struct hash_backet *, void *),
struct hash_backet *hb;
struct hash_backet *hbnext;
int ret = HASHWALK_CONTINUE;
uint32_t count = 0;
for (i = 0; i < hash->size; i++) {
for (hb = hash->index[i]; hb; hb = hbnext) {
@ -269,7 +276,10 @@ void hash_walk(struct hash *hash, int (*func)(struct hash_backet *, void *),
ret = (*func)(hb, arg);
if (ret == HASHWALK_ABORT)
return;
count++;
}
if (count == hash->count)
return;
}
}

View File

@ -2144,7 +2144,6 @@ DEFUN (vtysh_show_poll,
"Thread Poll Information\n")
{
unsigned int i;
int idx = 0;
int ret = CMD_SUCCESS;
char line[100];