On Mon, Aug 29, 2022 at 05:05:59PM +0200, Claudio Jeker wrote: > The hash table for communities is not great. Instead of implementing > dynamic hash resize use a RB tree. Also drop the hash calculation and > just use memcmp() for now. My non scientific test seems to indicate that > the overhead of SipHash is about the same as the memcmp().
Generally looks good. Two comments. > +static inline int > +communities_compare(struct rde_community *a, struct rde_community *b) > { > - uint32_t hs, i; > + if (a->nentries != b->nentries) > + return a->nentries - b->nentries; I dislike comparison by subtraction, but I guess it's fine since nentries should never be negative. Should this check and fatal? > + if (a->flags != b->flags) > + return a->flags - b->flags; [...] > struct rde_community * > communities_link(struct rde_community *comm) > { > struct rde_community *n; > - struct commhead *head; > > if ((n = malloc(sizeof(*n))) == NULL) > fatal(__func__); > - > communities_copy(n, comm); > > - head = communities_hash(n); > - LIST_INSERT_HEAD(head, n, entry); > + RB_INSERT(comm_tree, &commtable, n); I would prefer if this insertion was checked. > n->refcnt = 1; /* initial reference by the cache */ > > rdemem.comm_size += n->size; > @@ -886,7 +817,7 @@ communities_unlink(struct rde_community > if (comm->refcnt != 1) > fatalx("%s: unlinking still referenced communities", __func__); > > - LIST_REMOVE(comm, entry); > + RB_REMOVE(comm_tree, &commtable, comm); > > rdemem.comm_size -= comm->size; > rdemem.comm_nmemb -= comm->nentries; >