This is Unofficial EPICS BASE Doxygen Site
freeList.h File Reference
#include <stddef.h>
#include "libComAPI.h"
+ Include dependency graph for freeList.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

LIBCOM_API void epicsStdCall freeListInitPvt (void **ppvt, int size, int nmalloc)
 
LIBCOM_API void *epicsStdCall freeListCalloc (void *pvt)
 
LIBCOM_API void *epicsStdCall freeListMalloc (void *pvt)
 
LIBCOM_API void epicsStdCall freeListFree (void *pvt, void *pmem)
 
LIBCOM_API void epicsStdCall freeListCleanup (void *pvt)
 
LIBCOM_API size_t epicsStdCall freeListItemsAvail (void *pvt)
 

Function Documentation

LIBCOM_API void* epicsStdCall freeListCalloc ( void *  pvt)

Definition at line 60 of file freeListLib.c.

61 {
62  FREELISTPVT *pfl = pvt;
63 # ifdef EPICS_FREELIST_DEBUG
64  return callocMustSucceed(1,pfl->size,"freeList Debug Calloc");
65 # else
66  void *ptemp;
67 
68  ptemp = freeListMalloc(pvt);
69  if(ptemp) memset((char *)ptemp,0,pfl->size);
70  return(ptemp);
71 # endif
72 }
LIBCOM_API void *epicsStdCall freeListMalloc(void *pvt)
Definition: freeListLib.c:74
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
LIBCOM_API void epicsStdCall freeListCleanup ( void *  pvt)

Definition at line 152 of file freeListLib.c.

153 {
154  FREELISTPVT *pfl = pvt;
155  allocMem *phead;
156  allocMem *pnext;
157 
159 
160  phead = pfl->mallochead;
161  while(phead) {
162  pnext = phead->next;
163  free(phead->memory);
164  free(phead);
165  phead = pnext;
166  }
167  epicsMutexDestroy(pfl->lock);
168  free(pvt);
169 }
void epicsStdCall epicsMutexDestroy(epicsMutexId pmutexNode)
Destroy an epicsMutex semaphore.
Definition: epicsMutex.cpp:127
void * memory
Definition: freeListLib.c:32
epicsMutexId lock
Definition: freeListLib.c:40
#define VALGRIND_DESTROY_MEMPOOL(pool)
Definition: valgrind.h:6475
struct allocMem * next
Definition: freeListLib.c:31
allocMem * mallochead
Definition: freeListLib.c:38
LIBCOM_API void epicsStdCall freeListFree ( void *  pvt,
void *  pmem 
)

Definition at line 131 of file freeListLib.c.

132 {
133  FREELISTPVT *pfl = pvt;
134 # ifdef EPICS_FREELIST_DEBUG
135  memset ( pmem, 0xdd, pfl->size );
136  free(pmem);
137 # else
138  void **ppnext;
139 
140  VALGRIND_MEMPOOL_FREE(pvt, pmem);
141  VALGRIND_MEMPOOL_ALLOC(pvt, pmem, sizeof(void*));
142 
143  epicsMutexMustLock(pfl->lock);
144  ppnext = pmem;
145  *ppnext = pfl->head;
146  pfl->head = pmem;
147  pfl->nBlocksAvailable++;
148  epicsMutexUnlock(pfl->lock);
149 # endif
150 }
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
epicsMutexId lock
Definition: freeListLib.c:40
#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)
Definition: valgrind.h:6480
void * head
Definition: freeListLib.c:37
#define VALGRIND_MEMPOOL_FREE(pool, addr)
Definition: valgrind.h:6485
size_t nBlocksAvailable
Definition: freeListLib.c:39
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API void epicsStdCall freeListInitPvt ( void **  ppvt,
int  size,
int  nmalloc 
)

Definition at line 44 of file freeListLib.c.

45 {
46  FREELISTPVT *pfl;
47 
48  pfl = callocMustSucceed(1,sizeof(FREELISTPVT), "freeListInitPvt");
49  pfl->size = adjustToWorstCaseAlignment(size);
50  pfl->nmalloc = nmalloc;
51  pfl->head = NULL;
52  pfl->mallochead = NULL;
53  pfl->nBlocksAvailable = 0u;
54  pfl->lock = epicsMutexMustCreate();
55  *ppvt = (void *)pfl;
57  return;
58 }
LIBCOM_API size_t adjustToWorstCaseAlignment(size_t size)
Definition: adjustment.c:25
#define epicsMutexMustCreate()
Create an epicsMutex semaphore for use from C code.
Definition: epicsMutex.h:179
#define NULL
Definition: catime.c:38
#define REDZONE
Definition: freeListLib.c:20
#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)
Definition: valgrind.h:6470
epicsMutexId lock
Definition: freeListLib.c:40
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
void * head
Definition: freeListLib.c:37
size_t nBlocksAvailable
Definition: freeListLib.c:39
allocMem * mallochead
Definition: freeListLib.c:38
LIBCOM_API size_t epicsStdCall freeListItemsAvail ( void *  pvt)

Definition at line 171 of file freeListLib.c.

172 {
173  FREELISTPVT *pfl = pvt;
174  size_t nBlocksAvailable;
175  epicsMutexMustLock(pfl->lock);
176  nBlocksAvailable = pfl->nBlocksAvailable;
177  epicsMutexUnlock(pfl->lock);
178  return nBlocksAvailable;
179 }
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
epicsMutexId lock
Definition: freeListLib.c:40
size_t nBlocksAvailable
Definition: freeListLib.c:39
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API void* epicsStdCall freeListMalloc ( void *  pvt)

Definition at line 74 of file freeListLib.c.

75 {
76  FREELISTPVT *pfl = pvt;
77 # ifdef EPICS_FREELIST_DEBUG
78  return callocMustSucceed(1,pfl->size,"freeList Debug Malloc");
79 # else
80  void *ptemp;
81  void **ppnext;
82  allocMem *pallocmem;
83  int i;
84 
86  ptemp = pfl->head;
87  if(ptemp==0) {
88  /* layout of each block. nmalloc+1 REDZONEs for nmallocs.
89  * The first sizeof(void*) bytes are used to store a pointer
90  * to the next free block.
91  *
92  * | RED | size0 ------ | RED | size1 | ... | RED |
93  * | | next | ----- |
94  */
95  ptemp = (void *)malloc(pfl->nmalloc*(pfl->size+REDZONE)+REDZONE);
96  if(ptemp==0) {
97  epicsMutexUnlock(pfl->lock);
98  return(0);
99  }
100  pallocmem = (allocMem *)calloc(1,sizeof(allocMem));
101  if(pallocmem==0) {
102  epicsMutexUnlock(pfl->lock);
103  free(ptemp);
104  return(0);
105  }
106  pallocmem->memory = ptemp; /* real allocation */
107  ptemp = REDZONE + (char *) ptemp; /* skip first REDZONE */
108  if(pfl->mallochead)
109  pallocmem->next = pfl->mallochead;
110  pfl->mallochead = pallocmem;
111  for(i=0; i<pfl->nmalloc; i++) {
112  ppnext = ptemp;
113  VALGRIND_MEMPOOL_ALLOC(pfl, ptemp, sizeof(void*));
114  *ppnext = pfl->head;
115  pfl->head = ptemp;
116  ptemp = ((char *)ptemp) + pfl->size+REDZONE;
117  }
118  ptemp = pfl->head;
119  pfl->nBlocksAvailable += pfl->nmalloc;
120  }
121  ppnext = pfl->head;
122  pfl->head = *ppnext;
123  pfl->nBlocksAvailable--;
124  epicsMutexUnlock(pfl->lock);
125  VALGRIND_MEMPOOL_FREE(pfl, ptemp);
126  VALGRIND_MEMPOOL_ALLOC(pfl, ptemp, pfl->size);
127  return(ptemp);
128 # endif
129 }
int i
Definition: scan.c:967
void * memory
Definition: freeListLib.c:32
#define REDZONE
Definition: freeListLib.c:20
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
epicsMutexId lock
Definition: freeListLib.c:40
#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)
Definition: valgrind.h:6480
struct allocMem * next
Definition: freeListLib.c:31
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
void * head
Definition: freeListLib.c:37
#define VALGRIND_MEMPOOL_FREE(pool, addr)
Definition: valgrind.h:6485
size_t nBlocksAvailable
Definition: freeListLib.c:39
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
allocMem * mallochead
Definition: freeListLib.c:38