📄 plx_almem.c
字号:
/**************************************************************************\
*
* Pollex Mobile Platform
*
* Copyright (c) 2004 by Pollex Mobile Software Co., Ltd.
* All Rights Reserved
*
* Model :
*
* Purpose :
*
* Author :
*
*-------------------------------------------------------------------------
*
* $Archive:: $
* $Workfile:: $
* $Revision:: $ $Date:: $
*
\**************************************************************************/
#ifdef MMI_ON_HARDWARE_P
#include "kal_release.h"
#endif
#ifdef MMI_ON_WIN32
#include "stdio.h"
#include "stdlib.h"
#include "assert.h"
#endif
//#define PLX_MEM_TRACEOUT
//#define PLX_MEM_CHECK
extern void * plx_memcpy(void *dst0, const void *src0, unsigned int len0);
extern void PlxTrace(const char *fmt,...);
#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif
#ifdef MMI_ON_HARDWARE_P
#define PLX_ADM_SIZE 0x0A0000 // 10*64K
static KAL_ADM_ID gadm_id = NULL;
static kal_uint8 mem_addr[PLX_ADM_SIZE];
#endif
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
int plx_AppMemInit(void)
{
#ifdef MMI_ON_HARDWARE_P
static int mem_init = 0;
if ( mem_init == 0 ) {
gadm_id = kal_adm_create (mem_addr, PLX_ADM_SIZE, NULL, 0);
if ( gadm_id == NULL ) {
PlxTrace("***** kal_adm_create error ****** ");
return 0;
}
mem_init = 1;
PlxTrace("***** kal_adm_create at:0x%08x ****** ", mem_addr );
} else {
PlxTrace("***** kal_adm_create already ****** ", mem_addr );
}
return 1;
#else
return 1;
#endif
}
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
int plx_AppMemDestroy(void)
{
#ifdef MMI_ON_HARDWARE_P
kal_status ret;
ret = kal_adm_delete ( gadm_id );
return ret;
#else
return 0;
#endif
}
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
void * plx_malloc( size_t size )
{
#ifdef MMI_ON_HARDWARE_P
#ifdef PLX_MEM_CHECK
void *p = kal_adm_alloc (gadm_id, size + 12);
if ( p == NULL) {
PlxTrace("***** kal_adm_alloc memory shortage SIZE = %d ****** ", size);
return NULL;
}
*(long *)p = 0xfdfdfdfd;
*((long *)p+1) = size;
*((char *)p+size+8) = (char)0xfd;
*((char *)p+size+9) = (char)0xfd;
*((char *)p+size+10) = (char)0xfd;
*((char *)p+size+11) = (char)0xfd;
return ((long*)p+2);
#else // not define PLX_MEM_CHECK
void *p;
p = kal_adm_alloc (gadm_id, size+sizeof(unsigned long));
#ifdef PLX_MEM_TRACEOUT
PlxTrace("***** kal_adm_alloc at:0x%x SIZE = %d ****** ", p, size);
#endif
if ( p == NULL ) {
PlxTrace("***** kal_adm_alloc memory shortage SIZE = %d ****** ", size);
return NULL;
}
*(unsigned long *)p = size;
p = (char*)p + sizeof(unsigned long);
return p;
#endif // end if PLX_MEM_CHECK
#else // MMI_ON_WIN32
#ifdef PLX_MEM_CHECK
void *p = malloc(size + 12);
if ( p == NULL)
return NULL;
*(long *)p = 0xfdfdfdfd;
*((long *)p+1) = size;
*((char *)p+size+8) = (char)0xfd;
*((char *)p+size+9) = (char)0xfd;
*((char *)p+size+10) = (char)0xfd;
*((char *)p+size+11) = (char)0xfd;
return ((long*)p+2);
#else // not define PLX_MEM_CHECK
return malloc(size);
#endif // end of PLX_MEM_CHECK
#endif // end of MMI_ON_HARDWARE_P
}
/*
extern void WAP_DataOut(const unsigned char *pData, unsigned short Length,
const unsigned char *pName);
*/
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
void plx_freeD( void *memblock, const char * file, int line )
{
#ifdef MMI_ON_HARDWARE_P
#ifdef PLX_MEM_CHECK
void *p;
long size;
if ( memblock == NULL )
return;
p = (long*)memblock - 2;
size = *((long *)p+1);
if ( *(long *)p != 0xfdfdfdfd ) {
if ( *(long *)p == 0xdfdfdfdf ) {
PlxTrace( " *** free again %s : %d *** ", file, line );
} else {
PlxTrace( " *** free head error %s : %d *** ", file, line );
}
return;
}
if ( *((char*)p+size+8) != (char)0xfd || *((char*)p+size+9) != (char)0xfd
|| *((char*)p+size+10) != (char)0xfd || *((char*)p+size+11) != (char)0xfd )
{
PlxTrace( " *** free tail error %s : %d *** ", file, line );
// WAP_DataOut ((const unsigned char *)memblock, (unsigned short)size, (const unsigned char*)"MEMERROR");
return;
}
*(long *)p = 0xdfdfdfdf;
kal_adm_free (gadm_id, p);
#else // on hardware; not define PLX_MEM_CHECK
void *mem_addr = (void *)((char*)memblock - sizeof(unsigned long));
#ifdef PLX_MEM_TRACEOUT
PlxTrace("***** kal_adm_free at:0x%x ****** ", mem_addr);
#endif
if ( memblock == NULL )
return;
kal_adm_free (gadm_id, mem_addr);
#endif // end of PLX_MEM_CHECK
#else // MMI_ON_WIN32
#ifdef PLX_MEM_CHECK
void *p;
long size;
if ( memblock == NULL )
return;
p = (long*)memblock - 2;
size = *((long *)p+1);
if ( memblock == NULL )
return;
if ( *(long *)p != 0xfdfdfdfd )
return;
if ( *((char*)p+size+8) != (char)0xfd || *((char*)p+size+9) != (char)0xfd
|| *((char*)p+size+10) != (char)0xfd || *((char*)p+size+11) != (char)0xfd )
return;
free ( p );
#else // on WIN32; not define PLX_MEM_CHECK
free(memblock);
#endif
#endif
}
void plx_free( void *memblock )
{
#ifdef MMI_ON_HARDWARE_P
#ifdef PLX_MEM_CHECK
void *p;
long size;
if ( memblock == NULL )
return;
p = (long*)memblock - 2;
size = *((long *)p+1);
if ( *(long *)p != 0xfdfdfdfd ) {
if ( *(long *)p == 0xdfdfdfdf ) {
PlxTrace( " *** free again *** " );
} else {
PlxTrace( " *** free head error *** " );
}
return;
}
if ( *((char*)p+size+8) != (char)0xfd || *((char*)p+size+9) != (char)0xfd
|| *((char*)p+size+10) != (char)0xfd || *((char*)p+size+11) != (char)0xfd )
{
PlxTrace( " *** free tail error ");
// WAP_DataOut ((const unsigned char *)memblock, (unsigned short)size, (const unsigned char*)"MEMERROR");
return;
}
*(long *)p = 0xdfdfdfdf;
kal_adm_free (gadm_id, p);
#else // not define PLX_MEM_CHECK
void *mem_addr = (void *)((char*)memblock - sizeof(unsigned long));
#ifdef PLX_MEM_TRACEOUT
PlxTrace("***** kal_adm_free at:0x%x ****** ", mem_addr);
#endif
if ( memblock == NULL )
return;
kal_adm_free (gadm_id, mem_addr);
#endif // end of PLX_MEM_CHECK
#else // MMI_ON_WIN32
#ifdef PLX_MEM_CHECK
void *p;
long size;
if ( memblock == NULL )
return;
p = (long*)memblock - 2;
size = *((long *)p+1);
if ( *(long *)p != 0xfdfdfdfd )
return;
if ( *((char*)p+size+8) != (char)0xfd || *((char*)p+size+9) != (char)0xfd
|| *((char*)p+size+10) != (char)0xfd || *((char*)p+size+11) != (char)0xfd )
return;
free ( p );
#else //not define PLX_MEM_CHECK
free(memblock);
#endif // end of PLX_MEM_CHECK
#endif
}
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
void * plx_realloc(void *memblock, size_t size )
{
#ifdef MMI_ON_HARDWARE_P
unsigned long oldsize;
void *p, *mem_addr;
if ( memblock != NULL && size == 0 ) {
plx_free(memblock);
return NULL;
}
if ( memblock == NULL ) {
p = plx_malloc ( size);
if ( p == NULL ) {
return NULL;
}
return p;
}
oldsize = *(unsigned long *)((char *)memblock - sizeof(unsigned long) );
if ( size <= oldsize )
return memblock;
p = plx_malloc ( size );
if ( p == NULL ) {
PlxTrace("***** realloc memory shortage size:%d ****** ", size);
return NULL;
}
plx_memcpy( p, memblock, oldsize );
plx_free ( memblock );
return p;
#else // MMI_ON_WIN32
#ifdef PLX_MEM_CHECK
void *p;
if ( memblock == NULL ) {
p = malloc ( size+12 );
if ( p == NULL)
return NULL;
} else {
p = (long *)memblock - 2;
p = realloc( p, size+12);
if ( p == NULL)
return NULL;
}
*(long *)p = 0xfdfdfdfd;
*((long *)p+1) = size;
*((char *)p+size+8) = (char)0xfd;
*((char *)p+size+9) = (char)0xfd;
*((char *)p+size+10) = (char)0xfd;
*((char *)p+size+11) = (char)0xfd;
return ((long*)p+2);
#else
return realloc( memblock, size);
#endif
#endif
}
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
long plx_get_max_alloc_size(void)
{
#ifdef MMI_ON_HARDWARE_P
//kal_uint32 kal_adm_get_max_alloc_size (KAL_ADM_ID adm_id)
long size = (long)kal_adm_get_max_alloc_size ( gadm_id );
return size;
#else
return 4*1024*1024; // 4*M
#endif
}
long plx_get_total_left_size(void)
{
#ifdef MMI_ON_HARDWARE_P
//kal_uint32 kal_adm_get_total_left_size (KAL_ADM_ID adm_id)
long size = (long)kal_adm_get_total_left_size ( gadm_id );
return size;
#else
return 4*1024*1024; // 4*M
#endif
}
/*********************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
**********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -