Re: [PATCH v2 2/2] oidset: use khash
- From
René Scharfe <l.s.r@web.de>
- Date
- Oct 4, 2018, 05:56 UTC
- Message-ID
- <d17f104e-7cc2-5e73-78c9-6c268f9ec5b2@web.de>
- In-Reply-To
- <20181003194051.GB20709@sigill.intra.peff.net>
Am 03.10.2018 um 21:40 schrieb Jeff King:
Show 23 quoted lines
> 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.
Show 11 quoted lines
>> 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?
Show 8 quoted lines
> 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é