Am 03.10.2018 um 21:40 schrieb Jeff King: > On Wed, Oct 03, 2018 at 03:16:39PM +0200, René Scharfe wrote: >> diff --git a/fetch-pack.c b/fetch-pack.c >> index 75047a4b2a..a839315726 100644 >> --- a/fetch-pack.c >> +++ b/fetch-pack.c >> @@ -536,7 +536,7 @@ static int tip_oids_contain(struct oidset *tip_oids, >> * add to "newlist" between calls, the additions will always be for >> * oids that are already in the set. >> */ >> - if (!tip_oids->map.map.tablesize) { >> + if (!tip_oids->set.n_buckets) { >> add_refs_to_oidset(tip_oids, unmatched); >> add_refs_to_oidset(tip_oids, newlist); >> } > > This is a little intimate with the implementation of khash, but I think > it's probably OK (and really no worse than what was there before). > > As the comment above notes, I think we're really looking at the case > where this gets populated on the first call, but not subsequent ones. It > might be less hacky to use a "static int initialized" here. Or if we > want to avoid hidden globals, put the logic into filter_refs() to decide > when to populate. Right. I'd prefer the latter, but was unable to find a nice way that still populates the oidset lazily. It's certainly worth another look, and a separate series. >> diff --git a/oidset.h b/oidset.h >> index 40ec5f87fe..4b90540cd4 100644 >> --- a/oidset.h >> +++ b/oidset.h >> [...] >> +KHASH_INIT(oid, struct object_id, int, 0, oid_hash, oid_equal) > > This will declare these "static inline". Our other major "macros become > inline functions" code is commit-slab.h, and there we found it necessary > to add MAYBE_UNUSED. I wonder if we ought to be doing the same here (I > don't get any warnings, but I suspect sparse might complain). I doubt it (but didn't check) because khash.h defines kh_clear_##name(), which we don't use it anywhere and there have been no complaints so far. And if we wanted to add MAYBE_UNUSED then the right place for that would be in KHASH_INIT, no? > It might be nice if these functions could hide inside oidset.c (and just > declare the struct here). It looks like we might be able to do that with > __KHASH_TYPE(), but the double-underscore implies that we're not > supposed to. ;) > > I guess we also use a few of them in our inlines here. I'm not 100% sure > that oidset_* needs to be inlined either, but this is at least a pretty > faithful conversion of the original. We could inline all of the oidset functions, following the spirit of klib/khash.h. Or we could uninline all of them and then may be able to clean up oidset.h by using KHASH_DECLARE. Perhaps we'd need to guard with an "#ifndef THIS_IS_OIDSET_C" or similar to avoid a clash with KHASH_INIT. Not sure if any of that would be a worthwhile improvement.. René