⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plx_almem.c

📁 mtk wap和mms代码。。适应mtk 25。26平台
💻 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 + -