- Also outside of the KOBJOPLOOKUP macro - which in turn is used by

the code auto-generated for *.m - kobj_lookup_method(9) is useful;
  for example in back-ends or base class device drivers in order to
  determine whether a default method has been overridden. Thus, allow
  for the kobj_method_t pointer argument - used by KOBJOPLOOKUP in
  order to update the cache entry - of kobj_lookup_method(9), to be
  NULL. Actually, that pointer is redundant as it's just set to the
  same kobj_method_t that the kobj_lookup_method(9) function returns
  in the first place, but probably it serves to reduce the number of
  instructions generated for KOBJOPLOOKUP.
- For the same reason, move updating kobj_lookup_{hits,misses} (if
  KOBJ_STATS is defined) from kobj_lookup_method(9) to KOBJOPLOOKUP.
  As a side-effect, this gets rid of the convoluted approach of always
  incrementing kobj_lookup_hits in KOBJOPLOOKUP and then in case of
  a cache miss, decrementing it in kobj_lookup_method(9) again.
This commit is contained in:
Marius Strobl 2017-05-08 21:08:39 +00:00
parent 481d4fb4e4
commit 26d877f5b8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317982
2 changed files with 6 additions and 12 deletions

View File

@ -213,19 +213,11 @@ kobj_lookup_method(kobj_class_t cls,
{
kobj_method_t *ce;
#ifdef KOBJ_STATS
/*
* Correct for the 'hit' assumption in KOBJOPLOOKUP and record
* a 'miss'.
*/
kobj_lookup_hits--;
kobj_lookup_misses++;
#endif
ce = kobj_lookup_method_mi(cls, desc);
if (!ce)
ce = &desc->deflt;
*cep = ce;
if (cep)
*cep = ce;
return ce;
}

View File

@ -226,10 +226,12 @@ extern u_int kobj_lookup_misses;
kobj_method_t **_cep = \
&OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)]; \
kobj_method_t *_ce = *_cep; \
kobj_lookup_hits++; /* assume hit */ \
if (_ce->desc != _desc) \
if (_ce->desc != _desc) { \
_ce = kobj_lookup_method(OPS->cls, \
_cep, _desc); \
kobj_lookup_misses++; \
} else \
kobj_lookup_hits++; \
_m = _ce->func; \
} while(0)
#else