summaryrefslogtreecommitdiff
path: root/addons/ooh323c/src/memheap.c
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ooh323c/src/memheap.c')
-rw-r--r--addons/ooh323c/src/memheap.c108
1 files changed, 64 insertions, 44 deletions
diff --git a/addons/ooh323c/src/memheap.c b/addons/ooh323c/src/memheap.c
index 48040a7ef..d60b7a074 100644
--- a/addons/ooh323c/src/memheap.c
+++ b/addons/ooh323c/src/memheap.c
@@ -13,18 +13,12 @@
* maintain this copyright notice.
*
*****************************************************************************/
-
+#include <asterisk.h>
+#include <asterisk/lock.h>
#include <stdlib.h>
#include "memheap.h"
ASN1UINT g_defBlkSize = XM_K_MEMBLKSIZ;
-OSMallocFunc g_malloc_func = malloc;
-#ifndef _NO_REALLOC
-OSReallocFunc g_realloc_func = realloc;
-#else
-OSReallocFunc g_realloc_func = 0;
-#endif
-OSFreeFunc g_free_func = free;
static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
void* pMemBlk, int blockType);
@@ -172,6 +166,7 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
nunits = (((unsigned)(nbytes + 7)) >> 3);
pMemHeap = (OSMemHeap*) *ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
ppMemLink = &pMemHeap->phead;
/* if size is greater than 2**19, then allocate as RAW block */
@@ -181,17 +176,18 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
/* allocate raw block */
- data = g_malloc_func (nbytes);
+ data = malloc (nbytes);
if (data == NULL) {
return NULL;
}
pMemLink = memHeapAddBlock (ppMemLink, data, RTMEMMALLOC | RTMEMRAW);
if (pMemLink == 0) {
- g_free_func (data);
+ free (data);
return NULL;
}
/* save size of the RAW memory block behind the pMemLink */
*(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = nbytes;
+ ast_mutex_unlock(&pMemHeap->pLock);
return data;
}
@@ -337,7 +333,7 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
((((ASN1UINT)dataUnits) * 8u) + sizeof (OSMemBlk));
}
- pmem = (ASN1OCTET*) g_malloc_func (allocSize + sizeof (OSMemLink));
+ pmem = (ASN1OCTET*) malloc (allocSize + sizeof (OSMemLink));
if (0 != pmem) {
OSMemElemDescr* pElem;
@@ -361,7 +357,8 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
if (memHeapAddBlock (ppMemLink, pMemBlk, RTMEMSTD | RTMEMLINK) == 0)
{
- g_free_func (pmem);
+ free (pmem);
+ ast_mutex_unlock(&pMemHeap->pLock);
return NULL;
}
@@ -374,8 +371,10 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMBLOCK (pMemHeap, pMemBlk);
}
- else
+ else {
+ ast_mutex_unlock(&pMemHeap->pLock);
return NULL;
+ }
}
RTMEMDIAG2 ("memHeapAlloc: pMemBlk = 0x%x\n", pMemBlk);
RTMEMDIAG2 ("memHeapAlloc: pMemBlk->free_x = %d\n", pMemBlk->free_x);
@@ -384,6 +383,7 @@ void* memHeapAlloc (void** ppvMemHeap, int nbytes)
RTMEMDIAG2 ("memHeapAlloc: mem_p = 0x%x\n", mem_p);
RTMEMDIAG2 ("memHeapAlloc: sizeof (short) = %d\n", sizeof(short));
+ ast_mutex_unlock(&pMemHeap->pLock);
return (mem_p);
}
@@ -407,6 +407,9 @@ void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
if (mem_p == 0 || ppvMemHeap == 0 || *ppvMemHeap == 0) return;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+
+ ast_mutex_lock(&pMemHeap->pLock);
+
ppMemLink = &pMemHeap->phead;
/* look for chain of RAW blocks first */
@@ -434,13 +437,14 @@ void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
if ((pMemLink->blockType & RTMEMLINK) &&
(pMemLink->blockType & RTMEMMALLOC))
{
- g_free_func (pMemLink);
+ free (pMemLink);
}
else {
if (pMemLink->blockType & RTMEMMALLOC)
- g_free_func (pMemLink->pMemBlk);
- g_free_func (pMemLink);
+ free (pMemLink->pMemBlk);
+ free (pMemLink);
}
+ ast_mutex_unlock(&pMemHeap->pLock);
return;
}
pPrevMemLink = pMemLink;
@@ -455,6 +459,7 @@ void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
if (ISFREE (pElem)) { /* already freed! */
RTMEMDIAG2 ("memHeapFreePtr: "
"the element 0x%x is already freed!\n", pElem);
+ ast_mutex_unlock(&pMemHeap->pLock);
return;
}
@@ -548,11 +553,11 @@ void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
FILLFREEMEM (pMemBlk->plink, sizeof (*pMemBlk->plink));
FILLFREEMEM (pMemBlk->data, (pMemBlk->nunits * 8u));
- g_free_func (pMemBlk->plink);
+ free (pMemBlk->plink);
if (!(blockType & RTMEMLINK)) {
FILLFREEMEM (pMemBlk, sizeof (*pMemBlk));
- g_free_func (pMemBlk);
+ free (pMemBlk);
}
RTMEMDIAG2 ("memHeapFreePtr: pMemBlk = 0x%x was freed\n",
pMemBlk);
@@ -642,6 +647,7 @@ void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMBLOCK (pMemHeap, pMemBlk);
}
+ ast_mutex_unlock(&pMemHeap->pLock);
}
static void initNewFreeElement (OSMemBlk* pMemBlk,
@@ -741,26 +747,12 @@ void* memHeapRealloc (void** ppvMemHeap, void* mem_p, int nbytes_)
if ((pMemLink->blockType & RTMEMRAW) &&
pMemLink->pMemBlk == mem_p)
{
- if (pMemLink->blockType & RTMEMMALLOC)
- if (g_realloc_func != 0) {
- void *newMemBlk = g_realloc_func (pMemLink->pMemBlk, nbytes_);
- if (newMemBlk == 0)
- return 0;
- pMemLink->pMemBlk = newMemBlk;
- }
- else {
- /* use malloc/memcpy/free sequence instead of realloc */
- ASN1OCTET* newBuf;
- int oldSize = *(int*)(((char*)pMemLink) + sizeof (OSMemLink));
-
- if (oldSize == -1) return 0;
- newBuf = (ASN1OCTET*)g_malloc_func (nbytes_);
- if (newBuf == 0)
- return 0;
- memcpy (newBuf, pMemLink->pMemBlk, ASN1MIN (oldSize, nbytes_));
- free (pMemLink->pMemBlk);
- pMemLink->pMemBlk = newBuf;
- }
+ if (pMemLink->blockType & RTMEMMALLOC) {
+ void *newMemBlk = realloc (pMemLink->pMemBlk, nbytes_);
+ if (newMemBlk == 0)
+ return 0;
+ pMemLink->pMemBlk = newMemBlk;
+ }
else
return 0;
*(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = nbytes_;
@@ -994,6 +986,8 @@ void memHeapFreeAll (void** ppvMemHeap)
if (ppvMemHeap == 0 || *ppvMemHeap == 0) return;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
+
pMemLink = pMemHeap->phead;
RTMEMDIAG2 ("memHeapFreeAll: pMemHeap = 0x%x\n", pMemHeap);
@@ -1045,10 +1039,11 @@ void memHeapFreeAll (void** ppvMemHeap)
if (((pMemLink2->blockType & RTMEMSTD) ||
(pMemLink2->blockType & RTMEMMALLOC)) &&
!(pMemLink2->blockType & RTMEMLINK))
- g_free_func (pMemLink2->pMemBlk);
- g_free_func (pMemLink2);
+ free (pMemLink2->pMemBlk);
+ free (pMemLink2);
}
}
+ ast_mutex_unlock(&pMemHeap->pLock);
}
/* increments internal refCnt. use memHeapRelease to decrement and release */
@@ -1058,7 +1053,9 @@ void memHeapAddRef (void** ppvMemHeap)
if (ppvMemHeap == 0 || *ppvMemHeap == 0) return;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
pMemHeap->refCnt++;
+ ast_mutex_unlock(&pMemHeap->pLock);
}
/* Frees all memory and heap structure as well (if was allocated) */
@@ -1106,6 +1103,9 @@ void* memHeapMarkSaved (void** ppvMemHeap, const void* mem_p,
return 0;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+
+ ast_mutex_lock(&pMemHeap->pLock);
+
pMemLink = pMemHeap->phead;
/* look for chain of RAW blocks first */
@@ -1128,6 +1128,8 @@ void* memHeapMarkSaved (void** ppvMemHeap, const void* mem_p,
if (ISFREE (pElem)) { /* already freed! */
RTMEMDIAG2 ("memHeapMarkSaved: the element 0x%x is "
"already free!\n", pElem);
+
+ ast_mutex_unlock(&pMemHeap->pLock);
return 0;
}
@@ -1147,12 +1149,15 @@ void* memHeapMarkSaved (void** ppvMemHeap, const void* mem_p,
nsaved = pMemBlk->nsaved;
}
else
+ ast_mutex_unlock(&pMemHeap->pLock);
return 0;
}
if (saved && nsaved > 0)
pMemLink->blockType |= RTMEMSAVED;
else if (nsaved == 0)
pMemLink->blockType &= (~RTMEMSAVED);
+
+ ast_mutex_unlock(&pMemHeap->pLock);
return pMemLink->pMemBlk;
}
@@ -1167,6 +1172,8 @@ void memHeapReset (void** ppvMemHeap)
if (ppvMemHeap == 0 || *ppvMemHeap == 0) return;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
+
pMemLink = pMemHeap->phead;
TRACEFREE (pMemHeap, "memHeapReset\n\n");
while (pMemLink) {
@@ -1190,6 +1197,7 @@ void memHeapReset (void** ppvMemHeap)
}
pMemLink = pMemLink->pnext;
}
+ ast_mutex_unlock(&pMemHeap->pLock);
}
/* add memory block to list */
@@ -1206,7 +1214,7 @@ static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
if (blockType & RTMEMLINK)
pMemLink = (OSMemLink*) (((ASN1OCTET*)pMemBlk) - sizeof (OSMemLink));
else {
- pMemLink = (OSMemLink*) g_malloc_func (
+ pMemLink = (OSMemLink*) malloc (
sizeof(OSMemLink) + sizeof (int));
if (pMemLink == 0) return 0;
/* An extra integer is necessary to save a size of a RAW memory block
@@ -1257,6 +1265,8 @@ int memHeapCheckPtr (void** ppvMemHeap, void* mem_p)
return 0;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
+
pMemLink = pMemHeap->phead;
for (; pMemLink != 0; pMemLink = pMemLink->pnext) {
@@ -1264,8 +1274,10 @@ int memHeapCheckPtr (void** ppvMemHeap, void* mem_p)
/* if RAW block, the pointer should be stored in pMemBlk */
- if (pMemLink->pMemBlk == mem_p)
+ if (pMemLink->pMemBlk == mem_p) {
+ ast_mutex_unlock(&pMemHeap->pLock);
return 1;
+ }
}
else {
OSMemBlk* pMemBlk = (OSMemBlk*)pMemLink->pMemBlk;
@@ -1281,12 +1293,16 @@ int memHeapCheckPtr (void** ppvMemHeap, void* mem_p)
for (; pElem != 0; pElem = GETNEXT (pElem)) {
void* curMem_p = (void*) pElem_data (pElem);
- if (curMem_p == mem_p && !ISFREE (pElem))
+ if (curMem_p == mem_p && !ISFREE (pElem)) {
+ ast_mutex_unlock(&pMemHeap->pLock);
return 1;
+ }
}
}
}
}
+
+ ast_mutex_unlock(&pMemHeap->pLock);
return 0;
}
@@ -1301,6 +1317,8 @@ void memHeapSetProperty (void** ppvMemHeap, ASN1UINT propId, void* pProp)
memHeapCreate (ppvMemHeap);
pMemHeap = *(OSMemHeap**)ppvMemHeap;
+ ast_mutex_lock(&pMemHeap->pLock);
+
switch (propId) {
case OSRTMH_PROPID_DEFBLKSIZE:
pMemHeap->defBlkSize = *(ASN1UINT*)pProp;
@@ -1312,6 +1330,7 @@ void memHeapSetProperty (void** ppvMemHeap, ASN1UINT propId, void* pProp)
pMemHeap->flags &= ((~(*(ASN1UINT*)pProp)) | RT_MH_INTERNALMASK);
break;
}
+ ast_mutex_unlock(&pMemHeap->pLock);
}
int memHeapCreate (void** ppvMemHeap)
@@ -1319,12 +1338,13 @@ int memHeapCreate (void** ppvMemHeap)
OSMemHeap* pMemHeap;
if (ppvMemHeap == 0) return ASN_E_INVPARAM;
- pMemHeap = (OSMemHeap*) g_malloc_func (sizeof (OSMemHeap));
+ pMemHeap = (OSMemHeap*) malloc (sizeof (OSMemHeap));
if (pMemHeap == NULL) return ASN_E_NOMEM;
memset (pMemHeap, 0, sizeof (OSMemHeap));
pMemHeap->defBlkSize = g_defBlkSize;
pMemHeap->refCnt = 1;
pMemHeap->flags = RT_MH_FREEHEAPDESC;
+ ast_mutex_init(&pMemHeap->pLock);
*ppvMemHeap = (void*)pMemHeap;
return ASN_OK;
}