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

📄 appmemmgr.c

📁 MTK手机平台的MMI部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
 *****************************************************************************/
void mmi_frm_appmem_prompt_to_release_full_pool(
        MMI_ID_TYPE app_name, 
        MMI_ID_TYPE app_icon, 
        void (*success_callback)(void))
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    /* Avoid reentrance of the prompt screen.
       Application developers should be careful on designing the screen flow */
    MMI_ASSERT(!mmi_frm_appmem_is_in_prompt_screens() && 
               !mmi_frm_appmem_is_prompt_screens_in_history());

    /* Note the context g_mmi_frm_appmem_prompt is not reset  */
    g_mmi_frm_appmem_prompt.app_name = app_name;
    g_mmi_frm_appmem_prompt.app_icon = app_icon;
    g_mmi_frm_appmem_prompt.required_size = 0;
    g_mmi_frm_appmem_prompt.require_full_pool = MMI_TRUE;
    g_mmi_frm_appmem_prompt.stop_state = MMI_FRM_APPMEM_STOP_STATE_IGNORE;
    g_mmi_frm_appmem_prompt.keep_prompt_screen_in_history = MMI_TRUE;
    g_mmi_frm_appmem_prompt.success_callback = success_callback;

    mmi_frm_appmem_entry_prompt_screen();
}


/*****************************************************************************
 * FUNCTION
 *  mmi_frm_appmem_init
 * DESCRIPTION
 *  Initialize app-based ASM.
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
void mmi_frm_appmem_init(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_init(mmi_frm_appmem_stop_finished_handler);
}


/***************************************************************************** 
 * Unit Test 
 *****************************************************************************/

#ifdef APPLIB_MEM_UNIT_TEST

#define MMI_FRM_APPMEM_TEST1_SIZE   (60*1024)

#define MMI_FRM_APPMEM_TEST2_SIZE   (30*1024)

#define MMI_FRM_APPMEM_TEST3_SIZE   (100*1024)

#define MMI_FRM_APPMEM_TEST4_SIZE   (25*1024)

#define MMI_FRM_APPMEM_TEST5_SIZE   (40*1024)

#include "stdlib.h"

/*****************************************************************************
 * FUNCTION
 *  mmi_frm_appmem_unit_test_stress_alloc
 * DESCRIPTION
 *  Unit test routine
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
static void mmi_frm_appmem_unit_test_stress_alloc(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 *ptr_list[100];
    kal_int32 i, count, free_space_original, tmp;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST1);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST2);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST3);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST4);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST5);    

    free_space_original = applib_mem_ap_get_total_left_size();

#define ALLOC_SIZE(_idx)    ((_idx) + (_idx) * 256)
#define PTR_LIST_SIZE       (sizeof(ptr_list) / sizeof(void*))

    for (i = 0; i < PTR_LIST_SIZE; i++)
    {
        if ((ptr_list[i] = applib_mem_ap_alloc(APPLIB_MEM_AP_ID_TEST1, ALLOC_SIZE(i))) == NULL)
        {
            MMI_ASSERT(applib_mem_ap_get_max_alloc_size() < ALLOC_SIZE(i));
            break;
        }
    }

    count = i;
    MMI_ASSERT(count > 0);
    MMI_ASSERT(applib_mem_ap_get_alloc_count() == count);

    applib_mem_ap_check_integrity();

    tmp = 0;
    for (i = 0; i < count; i += 2)
    {
        tmp += ALLOC_SIZE(i);
        applib_mem_ap_free(ptr_list[i]);
    }

#ifndef MMI_ON_WIN32
    MMI_ASSERT(tmp < free_space_original - applib_mem_ap_get_total_left_size());
#endif

    applib_mem_ap_check_integrity();

    if (count >= 2)
    {
        for (i = 1; i < count; i += 2)
        {
            MMI_ASSERT(applib_mem_ap_is_valid_block(ptr_list[i]));
        }
    }

    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST2);

    applib_mem_ap_check_integrity();

    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST1);

    applib_mem_ap_check_integrity();

    MMI_ASSERT(free_space_original == applib_mem_ap_get_total_left_size());
    MMI_ASSERT(applib_mem_ap_get_alloc_count() == 0);    

    /* Random alloc/free */

    for (i = 0; i < PTR_LIST_SIZE; i++)
    {
        ptr_list[i] = NULL;
    }

    for (;;)
    {
        kal_int32 key = rand();
        if ((key % 1000) == 0)
        {
            break;
        }
        
        if (applib_mem_ap_get_alloc_count() == PTR_LIST_SIZE || key % 3 == 0)
        {
            i = ((key + 1) % PTR_LIST_SIZE);
            for (; i != key % PTR_LIST_SIZE; i++, i %= PTR_LIST_SIZE)
            {
                if (ptr_list[i])
                {
                    applib_mem_ap_free(ptr_list[i]);
                    ptr_list[i] = NULL;
                    break;
                }
            }
        }
        else
        {
            for (i = 0; i < PTR_LIST_SIZE; i++)
            {
                if (!ptr_list[i])
                {
                    kal_uint32 size = key % applib_mem_ap_get_pool_size();
                    ptr_list[i] = applib_mem_ap_alloc(APPLIB_MEM_AP_ID_TEST1 + (key % 5), size);
                    /* Test memory corruption detection */
                    // ptr_list[i][size/4] = 1;
                    // ptr_list[i][size/4 + 1] = 1;
                    // ptr_list[i][size/4 + 2] = 1;
                    break;
                }
            }
        }
        applib_mem_ap_check_integrity();
    }

    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST1);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST2);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST3);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST4);
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST5);    
    MMI_ASSERT(free_space_original == applib_mem_ap_get_total_left_size());
    MMI_ASSERT(applib_mem_ap_get_alloc_count() == 0);
}


static void mmi_frm_appmem_unit_test_stop_1_timer_hdlr(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST1);    
    applib_mem_ap_notify_stop_finished(APPLIB_MEM_AP_ID_TEST1, KAL_TRUE);
}


static void mmi_frm_appmem_unit_test_stop_1(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    StartTimer(FM_AUTO_TEST_COMMNON_TIMER, 10000, mmi_frm_appmem_unit_test_stop_1_timer_hdlr);
}


static void mmi_frm_appmem_unit_test_stop_2_timer_hdlr(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST2);
    applib_mem_ap_notify_stop_finished(APPLIB_MEM_AP_ID_TEST2, KAL_TRUE);
}


static void mmi_frm_appmem_unit_test_stop_2(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    StartTimer(FM_AUTO_TEST_COMMNON_TIMER, 300, mmi_frm_appmem_unit_test_stop_2_timer_hdlr);
}


static void mmi_frm_appmem_unit_test_stop_3_timer_hdlr(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST3);    
    applib_mem_ap_notify_stop_finished(APPLIB_MEM_AP_ID_TEST3, KAL_TRUE);
}


static void mmi_frm_appmem_unit_test_stop_3(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    StartTimer(FM_AUTO_TEST_COMMNON_TIMER, 3000, mmi_frm_appmem_unit_test_stop_3_timer_hdlr);
}


static void mmi_frm_appmem_unit_test_stop_4(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    applib_mem_ap_free_all(APPLIB_MEM_AP_ID_TEST4);        
    /* Return immediately */   
    applib_mem_ap_notify_stop_finished(APPLIB_MEM_AP_ID_TEST4, KAL_TRUE);
}


static void mmi_frm_appmem_unit_test_stop_5(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    /* Return immediately */
    applib_mem_ap_notify_stop_finished(APPLIB_MEM_AP_ID_TEST5, KAL_FALSE); /* Fail */
}

/*****************************************************************************
 * FUNCTION
 *  mmi_frm_appmem_unit_test_success_callback1
 * DESCRIPTION
 *  Callback function when memory was released.
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
static void (*g_mmi_frm_appmem_unit_test_run_callback1)(void);

⌨️ 快捷键说明

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