From 770d9ab313a5234345e77f7b3c02874b42885ff4 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 21 Dec 2015 13:44:23 -0500 Subject: [PATCH] freeListLib: instrument with valgrind --- src/libCom/freeList/freeListLib.c | 32 ++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/libCom/freeList/freeListLib.c b/src/libCom/freeList/freeListLib.c index 77cd566b1..a0ae73837 100644 --- a/src/libCom/freeList/freeListLib.c +++ b/src/libCom/freeList/freeListLib.c @@ -15,6 +15,15 @@ #include #include +#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; inmalloc; 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;