app_mem.c

来自「最新MTK手机软件源码」· C语言 代码 · 共 1,684 行 · 第 1/5 页

C
1,684
字号
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
 *
 * Filename:
 * ---------
 *  app_mem.c
 *
 * Project:
 * -------- 
 *  MAUI
 *
 * Description:
 * ------------
 *  ASM (Application Shared Memory)
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/

#define APP_MEM_C

/* Only applied to Pluto MMI */
#if !defined(NEPTUNE_MMI) && !defined(MMI_NOT_PRESENT)

#include "kal_release.h"
#include "app_mem.h"
#include "app_mem_config.h"

#ifdef MMI_ON_WIN32

/* PC Simulator doesn't have KAL ADM */
#include <stdlib.h>
#include <malloc.h>
#undef APPLIB_MEM_USE_ADM
#define APPLIB_DUMMY_POOL_ID    ((KAL_ADM_ID) 0x12121212)

#else /* MMI_ON_WIN32 */

#include "kal_adm.h"
#define APPLIB_MEM_USE_ADM

#endif /* MMI_ON_WIN32 */ 

#define APPLIB_MEM_ALIGNED_4(_ptr)      ((((kal_uint32)(_ptr)) & 3) == 0)
#ifdef WIN32
#define __align(x)
#endif

/***************************************************************************** 
 * Typedef 
 *****************************************************************************/

/* Context */

typedef void (*ap_stop_hdlr_type)(void);

typedef struct
{
    /* Initialized */
    kal_bool app_pool_inited;

    /* ADM pool ID of app-based ASM. If it is 0, applib_mem_ap_alloc_full_pool() was invoked. */
    KAL_ADM_ID app_pool_id;

    /* Count of allocated app-based blocks */
    kal_int32 app_alloc_count;

    /* Callback handler to process the result of stopping application in MMI task */
    void (*app_stop_finish_callback)(kal_uint32 app_id, kal_uint32 string_id, kal_bool result);

    /* Head node of app-based chunk */
    applib_mem_header_struct app_head;

    /* Application using applib_mem_ap_alloc_full_pool() */
    kal_uint32 app_id_of_full_pool;
    
    /* Handlers to stop application (executed in MMI task) */
    ap_stop_hdlr_type app_stop_callbacks[APPLIB_MEM_AP_ID_TOTAL];
    /* Application name table */
    kal_uint32 app_names[APPLIB_MEM_AP_ID_TOTAL];
    /* Application icon table */
    kal_uint32 app_icons[APPLIB_MEM_AP_ID_TOTAL];
    /* Application has not finished stopping */
    kal_bool app_is_stopping[APPLIB_MEM_AP_ID_TOTAL];


    /* ADM pool ID of screen-based ASM */
    KAL_ADM_ID screen_pool_id;
    /* Size of screen-based ASM pool */
    kal_uint32 screen_pool_size;    
    /* Count of allocated screen-based blocks */
    kal_int32 screen_alloc_count;
    /* Callback handler to get the current screen ID */
    kal_uint32 (*screen_id_callback)(void);
    /* Head node of screen-based chunk */
    applib_mem_header_struct screen_head;
} applib_mem_cntx_struct;

/*****************************************************************************              
 * Local Variable                                                                    
 *****************************************************************************/
    
/* Context of screen-based memory */
static applib_mem_cntx_struct g_applib_mem_cntx;

/* memory pool */
#ifdef __MTK_TARGET__
#pragma arm section zidata = "LARGEPOOL_FIRST_ZI"
#endif 

#if APPLIB_MEM_AP_POOL_ALIGN > 0
__align(APPLIB_MEM_AP_POOL_ALIGN)
#endif
/* Use kal_uint32 to be 4-byte aligned */
static kal_uint32 g_applib_mem_ap_pool[APPLIB_MEM_AP_POOL_SIZE/4];

#ifdef __MTK_TARGET__
#pragma arm section zidata = "LARGEPOOL_FIRST_ZI"
#endif 

/* for KAL ADM */
static const kal_uint32 g_applib_mem_pool_chunk_size[11] = 
{
    16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 0xffffffff, 0
};

/*****************************************************************************              
 * Local Function                                                                    
 *****************************************************************************/

 
/*****************************************************************************
 * FUNCTION
 *  APPLIB_MEM_SET_PATTERN
 * DESCRIPTION
 *  Fill guard pattern
 * PARAMETERS
 *  ptr         [OUT]       data pointer
 *  pattern     [IN]        guard pattern
 * RETURNS
 *  void
 *****************************************************************************/
#if APPLIB_MEM_GUARDPAT_LEN == 1
#define APPLIB_MEM_SET_PATTERN(ptr, pattern)  do {(*ptr) = (pattern);} while (0)
#else /* APPLIB_MEM_GUARDPAT_LEN == 1 */
static void APPLIB_MEM_SET_PATTERN(kal_uint32 *ptr, kal_uint32 pattern)
{
    kal_int32 i;
    for (i = 0; i < APPLIB_MEM_GUARDPAT_LEN; i++)
    {
        ptr[i] = pattern;
    }
}
#endif /* APPLIB_MEM_GUARDPAT_LEN == 1 */


/*****************************************************************************
 * FUNCTION
 *  APPLIB_MEM_COMP_PATTERN
 * DESCRIPTION
 *  Compare if the guard pattern is correct
 * PARAMETERS
 *  ptr         [IN]        data pointer
 *  pattern     [IN]        guard pattern
 * RETURNS
 *  return KAL_FALSE if the guard pattern is corrupted
 *****************************************************************************/
#if APPLIB_MEM_GUARDPAT_LEN == 1
#define APPLIB_MEM_COMP_PATTERN(ptr, pattern)	((kal_bool)((*ptr) == (pattern)))
#else /* APPLIB_MEM_GUARDPAT_LEN == 1 */
static kal_bool APPLIB_MEM_COMP_PATTERN(const kal_uint32 *ptr, kal_uint32 pattern)
{
    kal_int32 i;
    for (i = 0; i < APPLIB_MEM_GUARDPAT_LEN; i++)
    {
        if (ptr[i] != pattern)
        {
            return KAL_FALSE;
        }
    }
    return KAL_TRUE;
}
#endif /* APPLIB_MEM_GUARDPAT_LEN == 1 */

/*****************************************************************************              
 * Extern Global Variable                                                                    
 *****************************************************************************/

/*****************************************************************************              
 * Extern Global Function                                                                    
 *****************************************************************************/

/***************************************************************************** 
 * Application-based ASM 
 *****************************************************************************/

/*****************************************************************************
 * FUNCTION
 *  applib_mem_ap_init
 * DESCRIPTION
 *  Initialize app-based ASM.
 *  (The API is used by MMI framework only)
 * PARAMETERS
 *  stop_finish_callback_by_MMI    [IN]    callback to handle stopping application result (executed in MMI task)
 * RETURNS
 *  void
 *****************************************************************************/
void applib_mem_ap_init(void (*stop_finish_callback_by_MMI)(kal_uint32 app_id, kal_uint32 string_id, kal_bool result))
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    ASSERT(APPLIB_MEM_ALIGNED_4(g_applib_mem_ap_pool));
    
    if (g_applib_mem_cntx.app_pool_inited)
    {
        /* Already initialized */
        return;
    }
    
#ifdef APPLIB_MEM_USE_ADM
    g_applib_mem_cntx.app_pool_id = kal_adm_create(
                                        g_applib_mem_ap_pool,
                                        APPLIB_MEM_AP_POOL_SIZE,
                                        (kal_uint32*) g_applib_mem_pool_chunk_size,
                                        KAL_FALSE);
#else /* APPLIB_MEM_USE_ADM */
    g_applib_mem_cntx.app_pool_id = APPLIB_DUMMY_POOL_ID;
#endif /* APPLIB_MEM_USE_ADM */

    g_applib_mem_cntx.app_alloc_count = 0;
    
    ASSERT(stop_finish_callback_by_MMI != NULL);
    g_applib_mem_cntx.app_stop_finish_callback = stop_finish_callback_by_MMI;

    g_applib_mem_cntx.app_head.next = NULL;

    g_applib_mem_cntx.app_pool_inited = KAL_TRUE;
}


⌨️ 快捷键说明

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