freeListLib: instrument with valgrind
This commit is contained in:
committed by
Michael Davidsaver
parent
7e7cca6164
commit
770d9ab313
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user