On Sat, Jun 8, 2024 at 1:19 PM Christian Göttsche <cgoettsche@xxxxxxxxxxxxx> wrote: > > From: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> > > When the comparison function returns 0, avoid a repeated call to it. > > Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> Acked-by: James Carter <jwcart2@xxxxxxxxx> > --- > libsepol/src/hashtab.c | 53 +++++++++++++++++++++++++----------------- > 1 file changed, 32 insertions(+), 21 deletions(-) > > diff --git a/libsepol/src/hashtab.c b/libsepol/src/hashtab.c > index 2af3a9bf..399582b1 100644 > --- a/libsepol/src/hashtab.c > +++ b/libsepol/src/hashtab.c > @@ -112,15 +112,17 @@ int hashtab_insert(hashtab_t h, hashtab_key_t key, hashtab_datum_t datum) > hashtab_check_resize(h); > > hvalue = h->hash_value(h, key); > - prev = NULL; > - cur = h->htable[hvalue]; > - while (cur && h->keycmp(h, key, cur->key) > 0) { > - prev = cur; > - cur = cur->next; > - } > > - if (cur && (h->keycmp(h, key, cur->key) == 0)) > - return SEPOL_EEXIST; > + for (prev = NULL, cur = h->htable[hvalue]; cur; prev = cur, cur = cur->next) { > + int cmp; > + > + cmp = h->keycmp(h, key, cur->key); > + if (cmp > 0) > + continue; > + if (cmp == 0) > + return SEPOL_EEXIST; > + break; > + } > > newnode = (hashtab_ptr_t) malloc(sizeof(hashtab_node_t)); > if (newnode == NULL) > @@ -151,14 +153,19 @@ int hashtab_remove(hashtab_t h, hashtab_key_t key, > return SEPOL_ENOENT; > > hvalue = h->hash_value(h, key); > - last = NULL; > - cur = h->htable[hvalue]; > - while (cur != NULL && h->keycmp(h, key, cur->key) > 0) { > - last = cur; > - cur = cur->next; > + > + for (last = NULL, cur = h->htable[hvalue]; cur; last = cur, cur = cur->next) { > + int cmp; > + > + cmp = h->keycmp(h, key, cur->key); > + if (cmp > 0) > + continue; > + if (cmp == 0) > + break; > + return SEPOL_ENOENT; > } > > - if (cur == NULL || (h->keycmp(h, key, cur->key) != 0)) > + if (cur == NULL) > return SEPOL_ENOENT; > > if (last == NULL) > @@ -183,14 +190,18 @@ hashtab_datum_t hashtab_search(hashtab_t h, const_hashtab_key_t key) > return NULL; > > hvalue = h->hash_value(h, key); > - cur = h->htable[hvalue]; > - while (cur != NULL && h->keycmp(h, key, cur->key) > 0) > - cur = cur->next; > - > - if (cur == NULL || (h->keycmp(h, key, cur->key) != 0)) > - return NULL; > + for (cur = h->htable[hvalue]; cur; cur = cur->next) { > + int cmp; > + > + cmp = h->keycmp(h, key, cur->key); > + if (cmp > 0) > + continue; > + if (cmp == 0) > + return cur->datum; > + break; > + } > > - return cur->datum; > + return NULL; > } > > void hashtab_destroy(hashtab_t h) > -- > 2.45.1 > >