📄 appmemmgr.c
字号:
*****************************************************************************/
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 + -