📄 mfw_mfw.c
字号:
| PROJECT : MMI-Framework (8417) MODULE : MFW |
| STATE : code ROUTINE : mfwHeader |
+--------------------------------------------------------------------+
PURPOSE : get header of a given element
*/
MfwHnd mfwHeader (void)
{
return current_mfw_elem;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW |
| STATE : code ROUTINE : mfwControl |
+--------------------------------------------------------------------+
PURPOSE : retrieve element control block
*/
MfwHnd mfwControl (MfwHdr *h)
{
if (!h)
return 0;
if (h->type <= MfwTypNone || h->type >= MfwTypMax)
return 0;
return h->data;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW |
| STATE : code ROUTINE : mfwAlloc |
+--------------------------------------------------------------------+
PURPOSE : alloc MFW memory
*/
U8 *mfwAlloc (U16 size)
{
MfwMemHdr *p, *n, *l;
U8 *data_ptr;
if (!size)
{
TRACE_ERROR("mfwAlloc(): invalid memory request");
return 0;
}
#ifdef SENTINAL_CHECK
if (!mfwMemBase)
{
size += 8;
data_ptr = (U8 *) sysAlloc(size);
memset(data_ptr, 0x55, 4);
memset(data_ptr + (size-4), 0x55, 4);
data_ptr += 4;
return data_ptr;
}
size = (U16) mfwMemLarge(size) + 8;
if (size >= mfwMemLeft)
{
TRACE_ERROR("mfwAlloc(): no memory");
return 0;
}
if (mfwMemBase + mfwMem.next > mfwMemEnd
|| mfwMemBase + mfwMem.next < mfwMemBase)
{
TRACE_ERROR("mfwAlloc(): corrupted memory");
return 0;
}
p = &mfwMem; /* root of dyn memory */
n = (MfwMemHdr *) (mfwMemBase + p->next); /* first free block */
while ((U8 *) n < mfwMemEnd)
{
if (n->len == size) /* fits exactly: */
{
p->next = n->next; /* just remove from chain */
mfwMemLeft -= size;
if (mfwMemLeft < mfwMemLowWater)
mfwMemLowWater = mfwMemLeft;
data_ptr = (U8 *)n;
memset(data_ptr, 0x55, 4);
memset(data_ptr + size-4, 0x55, 4);
memset(data_ptr + 4, 0, size-8);
data_ptr += 4;
#ifdef TRACE_MEMORY
TRACE_EVENT_P2("MFWAlloc %d bytes in address %p",size,n);
mfwCheckMemoryLeft();
#endif
return data_ptr;
}
if (n->len > size) /* take it from a big one */
{
l = (MfwMemHdr *) ((U8 *) n + size); /* new header */
l->next = n->next; /* setup chain to next */
l->len = (U16) (n->len - size); /* remaining memory */
p->next += size; /* link with previous block */
mfwMemLeft -= size;
if (mfwMemLeft < mfwMemLowWater)
mfwMemLowWater = mfwMemLeft;
data_ptr = (U8 *)n;
memset(data_ptr, 0x55, 4);
memset(data_ptr + size-4, 0x55, 4);
memset(data_ptr + 4, 0, size-8);
data_ptr += 4;
#ifdef TRACE_MEMORY
TRACE_EVENT_P2("MFWAlloc %d bytes in address %p",size,n);
mfwCheckMemoryLeft();
#endif
return data_ptr; /* allocated me address */
}
p = n;
n = (MfwMemHdr *) (mfwMemBase + n->next);
}
#else
if (!mfwMemBase)
return (U8 *) sysAlloc(size);
size = (U16) mfwMemLarge(size);
if (size >= mfwMemLeft)
{
TRACE_ERROR("mfwAlloc(): no memory");
return 0;
}
if (mfwMemBase + mfwMem.next > mfwMemEnd
|| mfwMemBase + mfwMem.next < mfwMemBase)
{
TRACE_ERROR("mfwAlloc(): corrupted memory");
return 0;
}
p = &mfwMem; /* root of dyn memory */
n = (MfwMemHdr *) (mfwMemBase + p->next); /* first free block */
while ((U8 *) n < mfwMemEnd)
{
if (n->len == size) /* fits exactly: */
{
p->next = n->next; /* just remove from chain */
mfwMemLeft -= size;
if (mfwMemLeft < mfwMemLowWater)
mfwMemLowWater = mfwMemLeft;
memset(n,0,size);
#ifdef TRACE_MEMORY
TRACE_EVENT_P2("MFWAlloc %d bytes in address %p",size,n);
mfwCheckMemoryLeft();
#endif
return (U8 *) n;
}
if (n->len > size) /* take it from a big one */
{
l = (MfwMemHdr *) ((U8 *) n + size); /* new header */
l->next = n->next; /* setup chain to next */
l->len = (U16) (n->len - size); /* remaining memory */
p->next += size; /* link with previous block */
mfwMemLeft -= size;
if (mfwMemLeft < mfwMemLowWater)
mfwMemLowWater = mfwMemLeft;
memset(n,0,size);
#ifdef TRACE_MEMORY
TRACE_EVENT_P2("MFWAlloc %d bytes in address %p",size,n);
mfwCheckMemoryLeft();
#endif
return (U8 *) n; /* allocated me address */
}
p = n;
n = (MfwMemHdr *) (mfwMemBase + n->next);
}
#endif
if ((U8 *)n == mfwMemEnd)
{
TRACE_ERROR("mfwAlloc(): no memory block big enough to allocate size requested");
}
else
{
TRACE_ERROR("mfwAlloc(): Error: free list corruption is likely");
}
return 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW |
| STATE : code ROUTINE : mfwFree |
+--------------------------------------------------------------------+
PURPOSE : free allocated MFW memory
*/
void mfwFree (U8 *mem, U16 size)
{
MfwMemHdr *p, *n;
U32 check_val = 0x55555555;
#ifdef SENTINAL_CHECK
mem -= 4;
#endif
if (!size || !mem )
{
TRACE_ERROR("mfwFree(): invalid");
return; /* nothing to free */
}
#ifdef SENTINAL_CHECK
/*
** Check the 4 preceeding bytes to ensure they haven't been changed
*/
if (memcmp(mem, &check_val, 4) != 0)
{
TRACE_ERROR("mfwFree(): Error: Preceeding Sentinal Bytes have been corrupted");
}
#endif
#ifdef TRACE_MEMORY
TRACE_EVENT_P2("MFWFree address = %p - %d bytes",mem,size);
#endif
if (!mfwMemBase)
{
void *m = mem;
#ifdef SENTINAL_CHECK
/*
** Check the 4 last bytes to ensure they haven't been changed
*/
if (memcmp(mem + size + 4, &check_val, 4) != 0)
{
TRACE_ERROR("mfwFree(): Error: Following Sentinal Bytes have been corrupted");
}
#endif
sysFree(m);
return;
}
#ifdef SENTINAL_CHECK
size = (U16) mfwMemLarge(size) + 8;
#else
size = (U16) mfwMemLarge(size);
#endif
if ( mem < mfwMemBase || mem >= mfwMemEnd ||
mem + size > mfwMemEnd ||
mem + size <= mfwMemBase)
{
TRACE_ERROR("mfwFree(): invalid");
return; /* nothing to free */
}
p = &mfwMem; /* root of dyn memory */
n = (MfwMemHdr *) (mfwMemBase + p->next); /* first free block */
/*
** Skip through the Free Link List until we get to where the current pointer
** should be added
*/
while ((U8 *) n < mfwMemEnd && (U8 *) n < mem)
{ /* search allocated area */
p = n;
n = (MfwMemHdr *) (mfwMemBase + n->next);
}
/*
** Check that the select memory isn't already free
*/
if (mem == (U8 *) p || mem == (U8 *) n)
{
TRACE_ERROR("mfwFree(): already free");
return; /* already free */
}
/*
** Memory not already free
*/
#ifdef SENTINAL_CHECK
/*
** Check the 4 last bytes to ensure they haven't been changed
*/
if (memcmp(mem + size - 4, &check_val, 4) != 0)
{
TRACE_ERROR("mfwFree(): Error: Following Sentinal Bytes have been corrupted");
}
#endif
/*
** This memset should only be performed after we are sure that the memory should be freed
*/
memset(mem, 0, size);
if (p != &mfwMem && (U8 *) p + p->len == mem)
{ /* adjacent to left free: */
p->len += size; /* just add it */
}
else
{
p->next = (U16) (mem - mfwMemBase); /* new free link */
p = (MfwMemHdr *) mem; /* to new header */
p->next = (U16) ((U8 *) n - mfwMemBase); /* link to next */
p->len = size;
}
if ((U8 *) n < mfwMemEnd && mem + size == (U8 *) n)
{ /* adjacent to right free: */
p->next = n->next; /* eliminate link and */
p->len += n->len; /* eat up the space */
}
mfwMemLeft += size;
#ifdef TRACE_MEMORY
mfwCheckMemoryLeft();
#endif
}
U16 mfwCheckMemoryLeft(void){
char temp[40];
sprintf(temp,"memory left %d",mfwMemLeft);
TRACE_EVENT(temp);
return mfwMemLeft;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -