memmng.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 231 行

C
231
字号
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   */
/*                                                                          */
/* FILE NAME:   MemMng.c                                                    */
/* MODULE NAME: 内存管理                                                    */
/* DESCRIPTION: 本程序主要处理内存管理相关的函数                            */
/*                                                                          */
/* FUNCTIONS:                                                               */
/*              MemMngInitialize    内存管理模块初始化					    */
/*              MemAlloc            申请用户空间内存                        */
/*              MemFree             释放用户空间内存                        */
/*              MemCheckStart       设置内存申请检测点                      */
/*              MemCheckEnd         检测内存申请情况					    */
/*                                                                          */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/


/* 包含所需头文件 */
#include "Base.h"
#ifdef WIN32
#include "plus\inc\dm_defs.h"
#endif

/*---------------- 全局变量 ----------------*/
NU_MEMORY_POOL  g_mpCommMemPool;

#ifdef WIN32
void    OutDebugStr_ToPcOutput(char *strPtr);
static UINT8   g_byMemMask = 0;	// For Test
#endif

/****************************************************************************/
/* FUNCTION:   BOOL  MemMngInitialize(VOID)                                */
/* DESCRIPTION:内存管理模块初始化                                          */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     初始化成功返回TRUE,否则返回FALSE                           */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/
BOOL MemMngInitialize(VOID)
{
#ifdef WIN32
	g_byMemMask = 0;	// For Test
#endif
	return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VOID *MemAlloc(UINT32 dwSize)								*/
/* DESCRIPTION:申请用户空间内存                                            */
/* INPUTS:     dwSize - 要申请的内存大小                                   */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     申请到了则返回内存指针,否则返回NULL                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/
VOID *MemAlloc(UINT32 dwSize)
{
    VOID *pAlloc;
    if ( NU_Allocate_Memory(&g_mpCommMemPool, &pAlloc, dwSize, NU_NO_SUSPEND)
		 == NU_SUCCESS )
    {
#ifdef WIN32	// For Test
        DM_HEADER   *pMemHeader;
        pMemHeader = (DM_HEADER *) ((UINT32)pAlloc - DM_OVERHEAD);
        pMemHeader->dm_padding[0] = g_byMemMask;
#endif			// For Test end
		return pAlloc;
    }
    return (VOID*)NULL;
}

/****************************************************************************/
/* FUNCTION:   BOOL MemFree(VOID *pPtr)                                    */
/* DESCRIPTION:释放用户空间内存                                            */
/* INPUTS:     pPtr - 内存指针                                             */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     释放成功返回TRUE,否则返回FALSE                             */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/
BOOL MemFree(VOID *pPtr)
{
    if ( pPtr == NULL )
        return TRUE;

    if ( NU_Deallocate_Memory(pPtr) == NU_SUCCESS )
        return TRUE;

    return FALSE;
}


/****************************************************************************/
/* FUNCTION:   void MemCheckStart(void)                                    */
/* DESCRIPTION:设置内存申请检测点                                          */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/
void MemCheckStart(void)
{
#ifdef WIN32
    g_byMemMask++;
#endif
}

/****************************************************************************/
/* FUNCTION:   void MemCheckEnd(void)                                      */
/* DESCRIPTION:检测内存申请情况											*/
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-10          创建                                    */
/****************************************************************************/
void MemCheckEnd(void)
{
#ifdef WIN32	
	OPTION  opPreemptStatus;
	
    opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
	
    if( g_byMemMask > 0 )
    {
        DM_HEADER  *pMemHeader, *pMemNext;
        int         nNotFrees;
        VOID       *pFirstPtr;
		VOID       *pNextPtr;
		DM_PCB*    pool = (DM_PCB *)&g_mpCommMemPool;
        nNotFrees = 0;
        pMemHeader = pool->dm_memory_list;
        pMemNext = pMemHeader;
        do
        {
            if( !pMemNext->dm_memory_free &&
                (pMemNext->dm_padding[0] == g_byMemMask) )
            {
                if( nNotFrees == 0 )
                    pFirstPtr = (UINT8*)pMemNext + DM_OVERHEAD;
				if (nNotFrees == 1)
					pNextPtr  = (UINT8*)pMemNext + DM_OVERHEAD;
                nNotFrees++;
            }
            pMemNext = pMemNext->dm_next_memory;
        }while( pMemNext != pMemHeader );
		
        if ( nNotFrees > 0 )
        {   // 有未释放内存
            UINT8   aTempBuff[50];
            sprintf( aTempBuff, "有%d块内存未释放!", nNotFrees );
			OutDebugStr_ToPcOutput(aTempBuff);
            if( nNotFrees > 1 )
			{
                sprintf( aTempBuff, "第一块的指针为:0x%X\n", pFirstPtr );
				OutDebugStr_ToPcOutput( aTempBuff );
                sprintf( aTempBuff, "第二块的指针为:0x%X\n", pNextPtr );
				OutDebugStr_ToPcOutput( aTempBuff );
			}				
            else
			{
                sprintf( aTempBuff, "内存块的指针为:0x%X", pFirstPtr );
				OutDebugStr_ToPcOutput( aTempBuff );
			}
			/// DennyHan changed to NU_Sleep;
            while(1){NU_Sleep(100);}
        }
        g_byMemMask--;
    }
    NU_Change_Preemption(opPreemptStatus);
#endif
}

/****************************************************************************/
/* FUNCTION:   UINT32 GetMemSize(void)                                     */
/* DESCRIPTION:检测剩余内存大小,供调试用									*/
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   Bingle     2005-06-15          创建                                    */
/****************************************************************************/
UINT32 GetMemSize(void)
{
	UINT32     dwFreeMem = 0;
#ifdef WIN32	
	OPTION  opPreemptStatus;
	
    opPreemptStatus = NU_Change_Preemption(NU_NO_PREEMPT);
	{
        DM_HEADER  *pMemHeader, *pMemNext;
		DM_PCB*    pool = (DM_PCB *)&g_mpCommMemPool;

        pMemHeader = pool->dm_memory_list;
        pMemNext = pMemHeader;
        do
        {
            if( pMemNext->dm_memory_free)
            {
				dwFreeMem +=  (((BYTE_PTR) (pMemNext -> dm_next_memory)) -
					((BYTE_PTR) pMemNext)) - DM_OVERHEAD;
            }
            pMemNext = pMemNext->dm_next_memory;
        }while( pMemNext != pMemHeader );

	}
    NU_Change_Preemption(opPreemptStatus);
#endif
	return dwFreeMem;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?