Re: [PATCH] libsepol: hashtab: save one comparison on hit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 11, 2024 at 1:14 PM James Carter <jwcart2@xxxxxxxxx> wrote:
>
> 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>
>

Merged.
Thanks,
Jim

> > ---
> >  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
> >
> >





[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux