struct isc__mempool {
/* always unlocked */
- isc_mempool_t common; /*%< common header of mempool's */
- isc_mutex_t *lock; /*%< optional lock */
- isc__mem_t *mctx; /*%< our memory context */
- /*%< locked via the memory context's lock */
+ isc_mempool_t common; /*%< common header of mempool's */
+ isc__mem_t *mctx; /*%< our memory context */
ISC_LINK(isc__mempool_t) link; /*%< next pool in this mem context */
- /*%< optionally locked from here down */
- element *items; /*%< low water item list */
- size_t size; /*%< size of each item on this pool */
- unsigned int maxalloc; /*%< max number of items allowed */
- unsigned int allocated; /*%< # of items currently given out */
- unsigned int freecount; /*%< # of items on reserved list */
- unsigned int freemax; /*%< # of items allowed on free list */
- unsigned int fillcount; /*%< # of items to fetch on each fill */
+ element *items; /*%< low water item list */
+ size_t size; /*%< size of each item on this pool */
+ unsigned int maxalloc; /*%< max number of items allowed */
+ unsigned int allocated; /*%< # of items currently given out */
+ unsigned int freecount; /*%< # of items on reserved list */
+ unsigned int freemax; /*%< # of items allowed on free list */
+ unsigned int fillcount; /*%< # of items to fetch on each fill */
/*%< Stats only. */
unsigned int gets; /*%< # of requests to this pool */
/*%< Debugging only. */
#endif /* if ISC_MEMPOOL_NAMES */
(unsigned long)pool->size, pool->maxalloc,
pool->allocated, pool->freecount, pool->freemax,
- pool->fillcount, pool->gets,
- (pool->lock == NULL ? "N" : "Y"));
+ pool->fillcount, pool->gets, "N");
pool = ISC_LIST_NEXT(pool, link);
}
mpctx->common.impmagic = MEMPOOL_MAGIC;
mpctx->common.magic = ISCAPI_MPOOL_MAGIC;
- mpctx->lock = NULL;
mpctx->mctx = mctx;
/*
* Mempools are stored as a linked list of element.
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
#if ISC_MEMPOOL_NAMES
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
strlcpy(mpctx->name, name, sizeof(mpctx->name));
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
#else /* if ISC_MEMPOOL_NAMES */
UNUSED(mpctx);
UNUSED(name);
isc__mempool_t *mpctx;
isc__mem_t *mctx;
- isc_mutex_t *lock;
element *item;
mpctx = (isc__mempool_t *)*mpctxp;
mctx = mpctx->mctx;
- lock = mpctx->lock;
-
- if (lock != NULL) {
- LOCK(lock);
- }
-
/*
* Return any items on the free list
*/
isc_mem_put((isc_mem_t *)mpctx->mctx, mpctx, sizeof(isc__mempool_t));
- if (lock != NULL) {
- UNLOCK(lock);
- }
-
*mpctxp = NULL;
}
-void
-isc_mempool_associatelock(isc_mempool_t *mpctx0, isc_mutex_t *lock) {
- REQUIRE(VALID_MEMPOOL(mpctx0));
- REQUIRE(lock != NULL);
-
- isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
-
- REQUIRE(mpctx->lock == NULL);
-
- mpctx->lock = lock;
-}
-
#if __SANITIZE_ADDRESS__
void *
isc__mempool_get(isc_mempool_t *mpctx0 FLARG) {
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
isc_mem_t *mctx = (isc_mem_t *)mpctx->mctx;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
/*
* Don't let the caller go over quota
*/
mpctx->allocated++;
out:
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
return (item);
}
REQUIRE(mem != NULL);
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
INSIST(mpctx->allocated > 0);
mpctx->allocated--;
isc__mem_put(mctx, mem, mpctx->size FLARG_PASS);
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
}
#else /* __SANITIZE_ADDRESS__ */
mctx = mpctx->mctx;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
/*
* Don't let the caller go over quota
*/
mpctx->allocated++;
out:
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
#if ISC_MEM_TRACKLINES
if (ISC_UNLIKELY(((isc_mem_debugging & TRACE_OR_RECORD) != 0) &&
item != NULL)) {
isc__mem_t *mctx = mpctx->mctx;
element *item;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
INSIST(mpctx->allocated > 0);
mpctx->allocated--;
mem_put(mctx, mem, mpctx->size);
}
MCTXUNLOCK(mctx);
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
return;
}
item = (element *)mem;
item->next = mpctx->items;
mpctx->items = item;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
}
#endif /* __SANITIZE_ADDRESS__ */
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
mpctx->freemax = limit;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
}
unsigned int
REQUIRE(VALID_MEMPOOL(mpctx0));
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- unsigned int freemax;
-
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
- freemax = mpctx->freemax;
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
- return (freemax);
+ return (mpctx->freemax);
}
unsigned int
REQUIRE(VALID_MEMPOOL(mpctx0));
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- unsigned int freecount;
-
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
- freecount = mpctx->freecount;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
- return (freecount);
+ return (mpctx->freecount);
}
void
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
mpctx->maxalloc = limit;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
}
unsigned int
REQUIRE(VALID_MEMPOOL(mpctx0));
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- unsigned int maxalloc;
-
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
- maxalloc = mpctx->maxalloc;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
- return (maxalloc);
+ return (mpctx->maxalloc);
}
unsigned int
REQUIRE(VALID_MEMPOOL(mpctx0));
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- unsigned int allocated;
-
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
- allocated = mpctx->allocated;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
- return (allocated);
+ return (mpctx->allocated);
}
void
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
mpctx->fillcount = limit;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
}
unsigned int
isc__mempool_t *mpctx = (isc__mempool_t *)mpctx0;
- unsigned int fillcount;
-
- if (mpctx->lock != NULL) {
- LOCK(mpctx->lock);
- }
-
- fillcount = mpctx->fillcount;
-
- if (mpctx->lock != NULL) {
- UNLOCK(mpctx->lock);
- }
-
- return (fillcount);
+ return (mpctx->fillcount);
}
/*
(nthreads * ITERS * NUM_ITEMS) / (t / 1000000.0));
}
-static isc_threadresult_t
-mempool_thread(isc_threadarg_t arg) {
- isc_mempool_t *mp = (isc_mempool_t *)arg;
- void *items[NUM_ITEMS];
-
- for (int i = 0; i < ITERS; i++) {
- for (int j = 0; j < NUM_ITEMS; j++) {
- items[j] = isc_mempool_get(mp);
- }
- for (int j = 0; j < NUM_ITEMS; j++) {
- isc_mempool_put(mp, items[j]);
- }
- }
-
- return ((isc_threadresult_t)0);
-}
-
-static void
-isc_mempool_benchmark(void **state) {
- int nthreads = ISC_MAX(ISC_MIN(isc_os_ncpus(), 32), 1);
- isc_thread_t threads[32];
- isc_time_t ts1, ts2;
- double t;
- isc_result_t result;
- size_t size = ITEM_SIZE;
- isc_mempool_t *mp = NULL;
- isc_mutex_t mplock;
-
- isc_mutex_init(&mplock);
-
- isc_mempool_create(test_mctx, ITEM_SIZE, &mp);
-
- isc_mempool_associatelock(mp, &mplock);
-
- isc_mempool_setfreemax(mp, 32768);
- isc_mempool_setfillcount(mp, ISC_MAX(NUM_ITEMS / nthreads, 1));
-
- UNUSED(state);
-
- result = isc_time_now(&ts1);
- assert_int_equal(result, ISC_R_SUCCESS);
-
- for (int i = 0; i < nthreads; i++) {
- isc_thread_create(mempool_thread, mp, &threads[i]);
- size = size / 2;
- }
- for (int i = 0; i < nthreads; i++) {
- isc_thread_join(threads[i], NULL);
- }
-
- result = isc_time_now(&ts2);
- assert_int_equal(result, ISC_R_SUCCESS);
-
- t = isc_time_microdiff(&ts2, &ts1);
-
- printf("[ TIME ] isc_mempool_benchmark: "
- "%d isc_mempool_{get,put} calls, %f seconds, %f calls/second\n",
- nthreads * ITERS * NUM_ITEMS, t / 1000000.0,
- (nthreads * ITERS * NUM_ITEMS) / (t / 1000000.0));
-
- isc_mempool_destroy(&mp);
- isc_mutex_destroy(&mplock);
-}
-
#endif /* __SANITIZE_THREAD */
/*
#if !defined(__SANITIZE_THREAD__)
cmocka_unit_test_setup_teardown(isc_mem_benchmark, _setup,
_teardown),
- cmocka_unit_test_setup_teardown(isc_mempool_benchmark, _setup,
- _teardown),
#endif /* __SANITIZE_THREAD__ */
#if ISC_MEM_TRACKLINES
cmocka_unit_test_setup_teardown(isc_mem_noflags_test, _setup,