freeListLib: instrument with valgrind

This commit is contained in:
Michael Davidsaver
2015-12-21 13:44:23 -05:00
committed by Michael Davidsaver
parent 7e7cca6164
commit 770d9ab313

View File

@@ -15,6 +15,15 @@
#include <stdlib.h>
#include <stddef.h>
#include "valgrind/valgrind.h"
#ifndef NVALGRIND
/* buffer around allocations to detect out of bounds access */
#define REDZONE sizeof(double)
#else
#define REDZONE 0
#endif
#define epicsExportSharedSymbols
#include "cantProceed.h"
#include "epicsMutex.h"
@@ -47,6 +56,7 @@ epicsShareFunc void epicsShareAPI
pfl->nBlocksAvailable = 0u;
pfl->lock = epicsMutexMustCreate();
*ppvt = (void *)pfl;
VALGRIND_CREATE_MEMPOOL(pfl, REDZONE, 0);
return;
}
@@ -78,7 +88,14 @@ epicsShareFunc void * epicsShareAPI freeListMalloc(void *pvt)
epicsMutexMustLock(pfl->lock);
ptemp = pfl->head;
if(ptemp==0) {
ptemp = (void *)malloc(pfl->nmalloc*pfl->size);
/* layout of each block. nmalloc+1 REDZONEs for nmallocs.
* The first sizeof(void*) bytes are used to store a pointer
* to the next free block.
*
* | RED | size0 ------ | RED | size1 | ... | RED |
* | | next | ----- |
*/
ptemp = (void *)malloc(pfl->nmalloc*(pfl->size+REDZONE)+REDZONE);
if(ptemp==0) {
epicsMutexUnlock(pfl->lock);
return(0);
@@ -89,15 +106,17 @@ epicsShareFunc void * epicsShareAPI freeListMalloc(void *pvt)
free(ptemp);
return(0);
}
pallocmem->memory = ptemp;
pallocmem->memory = ptemp; /* real allocation */
ptemp += REDZONE; /* skip first REDZONE */
if(pfl->mallochead)
pallocmem->next = pfl->mallochead;
pfl->mallochead = pallocmem;
for(i=0; i<pfl->nmalloc; i++) {
ppnext = ptemp;
VALGRIND_MEMPOOL_ALLOC(pfl, ptemp, sizeof(void*));
*ppnext = pfl->head;
pfl->head = ptemp;
ptemp = ((char *)ptemp) + pfl->size;
ptemp = ((char *)ptemp) + pfl->size+REDZONE;
}
ptemp = pfl->head;
pfl->nBlocksAvailable += pfl->nmalloc;
@@ -106,6 +125,8 @@ epicsShareFunc void * epicsShareAPI freeListMalloc(void *pvt)
pfl->head = *ppnext;
pfl->nBlocksAvailable--;
epicsMutexUnlock(pfl->lock);
VALGRIND_MEMPOOL_FREE(pfl, ptemp);
VALGRIND_MEMPOOL_ALLOC(pfl, ptemp, pfl->size);
return(ptemp);
# endif
}
@@ -119,6 +140,9 @@ epicsShareFunc void epicsShareAPI freeListFree(void *pvt,void*pmem)
# else
void **ppnext;
VALGRIND_MEMPOOL_FREE(pvt, pmem);
VALGRIND_MEMPOOL_ALLOC(pvt, pmem, sizeof(void*));
epicsMutexMustLock(pfl->lock);
ppnext = pmem;
*ppnext = pfl->head;
@@ -134,6 +158,8 @@ epicsShareFunc void epicsShareAPI freeListCleanup(void *pvt)
allocMem *phead;
allocMem *pnext;
VALGRIND_DESTROY_MEMPOOL(pvt);
phead = pfl->mallochead;
while(phead) {
pnext = phead->next;