Merge branch 'ondrej/improve-mempool-AddressSanitizer-integration' into 'main'

Improve allocation-deallocation tracking with AddressSanitizer

See merge request isc-projects/bind9!4748
This commit is contained in:
Evan Hunt 2021-02-26 18:26:28 +00:00
commit 8795b12c49
2 changed files with 40 additions and 3 deletions

View file

@ -1294,18 +1294,50 @@ void
isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock) {
REQUIRE(VALID_MEMPOOL(mpctx));
REQUIRE(lock != NULL);
REQUIRE(mpctx->lock == NULL);
mpctx->lock = lock;
}
#if __SANITIZE_ADDRESS__
void *
isc__mempool_get(isc_mempool_t *mpctx FLARG) {
REQUIRE(VALID_MEMPOOL(mpctx));
element *item;
size_t allocated = atomic_fetch_add_release(&mpctx->allocated, 1);
size_t maxalloc = atomic_load_acquire(&mpctx->maxalloc);
/*
* Don't let the caller go over quota.
*/
if (ISC_UNLIKELY(allocated >= maxalloc)) {
atomic_fetch_sub_release(&mpctx->allocated, 1);
return (NULL);
}
atomic_fetch_add_relaxed(&mpctx->gets, 1);
return (isc__mem_get(mpctx->mctx, mpctx->size FLARG_PASS));
}
void
isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
REQUIRE(VALID_MEMPOOL(mpctx));
REQUIRE(mem != NULL);
INSIST(atomic_fetch_sub_release(&mpctx->allocated, 1) > 0);
isc__mem_put(mpctx->mctx, mem, mpctx->size FLARG_PASS);
}
#else /* __SANITIZE_ADDRESS__ */
void *
isc__mempool_get(isc_mempool_t *mpctx FLARG) {
element *item = NULL;
unsigned int i;
REQUIRE(VALID_MEMPOOL(mpctx));
size_t allocated = atomic_fetch_add_release(&mpctx->allocated, 1);
size_t maxalloc = atomic_load_acquire(&mpctx->maxalloc);
@ -1359,11 +1391,12 @@ out:
/* coverity[+free : arg-1] */
void
isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
element *item = NULL;
REQUIRE(VALID_MEMPOOL(mpctx));
REQUIRE(mem != NULL);
isc_mem_t *mctx = mpctx->mctx;
element *item;
size_t freecount = atomic_load_acquire(&mpctx->freecount);
size_t freemax = atomic_load_acquire(&mpctx->freemax);
@ -1393,6 +1426,8 @@ isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
MPCTXUNLOCK(mpctx);
}
#endif /* __SANITIZE_ADDRESS__ */
/*
* Quotas
*/

View file

@ -107,8 +107,10 @@ isc_mem_test(void **state) {
items1[i] = NULL;
}
#if !__SANITIZE_ADDRESS__
rval = isc_mempool_getfreecount(mp1);
assert_int_equal(rval, 10);
#endif /* !__SANITIZE_ADDRESS__ */
rval = isc_mempool_getallocated(mp1);
assert_int_equal(rval, 19);