X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fbase%2Fappcore_base.c;h=4507e2368f1a7189cdd2d694fc4f2ed6d5d73c77;hb=ceee35afe1fdde6b5fb5542c5696375e812d20c8;hp=c8617d530058cf9b7a2fd24a49741981dcdbfa15;hpb=1ef6146605a61737feb6d70a6eef4aaf9fac5f32;p=platform%2Fcore%2Fappfw%2Fapp-core.git diff --git a/src/base/appcore_base.c b/src/base/appcore_base.c index c8617d5..4507e23 100644 --- a/src/base/appcore_base.c +++ b/src/base/appcore_base.c @@ -38,13 +38,16 @@ #include #include #include + #include "appcore_base.h" #include "appcore_base_private.h" +#include "appcore_watchdog.h" #define PATH_LOCALE "locale" -#define RESOURCED_FREEZER_PATH "/Org/Tizen/Resourced/Freezer" +#define RESOURCED_FREEZER_PATH "/Org/Tizen/ResourceD/Freezer" #define RESOURCED_FREEZER_INTERFACE "org.tizen.resourced.freezer" #define RESOURCED_FREEZER_SIGNAL "FreezerState" +#define SQLITE_FLUSH_MAX (1024 * 1024) typedef struct _appcore_base_context { appcore_base_ops ops; @@ -69,6 +72,8 @@ typedef struct _appcore_base_rotation { int lock; int ref; enum appcore_base_rm rm; + int charger_status; + bool initialized; } appcore_base_rotation; struct lang_info_s { @@ -242,13 +247,9 @@ static void __auto_rotation_changed_cb(sensor_t sensor, unsigned int event_type, __invoke_callback((void *)&__rotation.rm, APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED); } -static void __unregister_rotation_changed_event(void) +static void __fini_rotation(void) { - if (!__rotation.ref) - return; - - __rotation.ref--; - if (__rotation.ref > 1) + if (!__rotation.initialized) return; vconf_ignore_key_changed(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __lock_cb); @@ -257,19 +258,17 @@ static void __unregister_rotation_changed_event(void) sensord_disconnect(__rotation.conn); __rotation.lock = 0; - __rotation.ref = 0; + __rotation.initialized = false; } -static void __register_rotation_changed_event(void) +static void __init_rotation(void) { sensor_t sensor; int lock; bool r; - if (__rotation.ref) { - __rotation.ref++; + if (__rotation.initialized) return; - } sensor = sensord_get_sensor(AUTO_ROTATION_SENSOR); __rotation.conn = sensord_connect(sensor); @@ -299,6 +298,60 @@ static void __register_rotation_changed_event(void) vconf_notify_key_changed(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, __lock_cb, NULL); __rotation.lock = !lock; + __rotation.initialized = true; +} + +static void __charger_status_changed_cb(keynode_t *keynode, void *user_data) +{ + if (TIZEN_FEATURE_CHARGER_STATUS) { + __rotation.charger_status = vconf_keynode_get_int(keynode); + if (__rotation.charger_status) { + if (__rotation.ref) + __init_rotation(); + } else { + if (__rotation.ref) + __fini_rotation(); + } + _DBG("charger status(%d)", __rotation.charger_status); + } +} + +static void __unregister_rotation_changed_event(void) +{ + if (!__rotation.ref) + return; + + __rotation.ref--; + if (__rotation.ref > 1) + return; + + __fini_rotation(); + if (TIZEN_FEATURE_CHARGER_STATUS) { + vconf_ignore_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, + __charger_status_changed_cb); + } + + __rotation.ref = 0; +} + +static void __register_rotation_changed_event(void) +{ + if (__rotation.ref) { + __rotation.ref++; + return; + } + + if (TIZEN_FEATURE_CHARGER_STATUS) { + vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, + &__rotation.charger_status); + vconf_notify_key_changed(VCONFKEY_SYSMAN_CHARGER_STATUS, + __charger_status_changed_cb, NULL); + if (__rotation.charger_status) + __init_rotation(); + } else { + __init_rotation(); + } + __rotation.ref++; } @@ -618,8 +671,15 @@ static void __update_lang(void) r = setlocale(LC_ALL, ""); if (r == NULL) { r = setlocale(LC_ALL, "en_US.UTF-8"); - if (r != NULL) + if (r != NULL) { _DBG("*****appcore setlocale=%s\n", r); + } else { + _DBG("*****appcore setlocale=\"C\""); + setenv("LC_ALL", "C", 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) + _ERR("failed to setlocale"); + } } free(lang); } @@ -644,8 +704,15 @@ static void __update_region(void) setenv("LC_MEASUREMENT", region, 1); setenv("LC_IDENTIFICATION", region, 1); r = setlocale(LC_ALL, ""); - if (r != NULL) + if (r != NULL) { _DBG("*****appcore setlocale=%s\n", r); + } else { + _DBG("*****appcore setlocale=\"C\""); + setenv("LC_ALL", "C", 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) + _ERR("failed to setlocale"); + } free(region); } @@ -726,7 +793,9 @@ static gboolean __flush_memory(gpointer data) { int suspend = APPCORE_BASE_SUSPENDED_STATE_WILL_ENTER_SUSPEND; - appcore_base_flush_memory(); + if (__context.ops.trim_memory) + __context.ops.trim_memory(__context.data); + __context.tid = 0; if (!__context.allowed_bg && !__context.suspended_state) { @@ -895,10 +964,17 @@ static int __set_i18n(const char *domain, const char *dir) /* if locale is not set properly, try to set "en_US" again */ if (r == NULL) { r = setlocale(LC_ALL, "en_US.UTF-8"); - _DBG("*****appcore setlocale=%s\n", r); + if (r != NULL) + _DBG("*****appcore setlocale=%s\n", r); } - if (r == NULL) + if (r == NULL) { _ERR("appcore: setlocale() error"); + _DBG("*****appcore setlocale=\"C\""); + setenv("LC_ALL", "C", 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) + _ERR("failed to setlocale"); + } r = bindtextdomain(domain, dir); if (r == NULL) @@ -950,6 +1026,28 @@ EXPORT_API int appcore_base_set_i18n(const char *domain_name, const char *dir_na return __set_i18n(domain_name, dir_name); } +static void __set_default_events(void) +{ + int r; + + vconf_notify_key_changed(VCONFKEY_LANGSET, __on_language_change, NULL); + r = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __on_region_change, NULL); + if (r == 0) + vconf_notify_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __on_region_change, NULL); + vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory, NULL); +} + +static void __unset_default_events(void) +{ + int r; + + vconf_ignore_key_changed(VCONFKEY_LANGSET, __on_language_change); + r = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __on_region_change); + if (r == 0) + vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __on_region_change); + vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory); +} + EXPORT_API int appcore_base_init(appcore_base_ops ops, int argc, char **argv, void *data) { int i; @@ -981,9 +1079,12 @@ EXPORT_API int appcore_base_init(appcore_base_ops ops, int argc, char **argv, vo } __verify_language(); + __set_default_events(); if (__context.ops.set_i18n) __context.ops.set_i18n(__context.data); + appcore_watchdog_enable(); + if (__context.ops.create) { traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:CREATE"); r = __context.ops.create(__context.data); @@ -1005,6 +1106,7 @@ EXPORT_API void appcore_base_fini(void) int i; aul_status_update(STATUS_DYING); + appcore_watchdog_disable(); if (__context.ops.terminate) { traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:TERMINATE"); __context.ops.terminate(__context.data); @@ -1018,6 +1120,8 @@ EXPORT_API void appcore_base_fini(void) } } + __unset_default_events(); + if (__context.sid) { g_source_remove(__context.sid); __context.sid = 0; @@ -1042,33 +1146,20 @@ EXPORT_API void appcore_base_fini(void) EXPORT_API int appcore_base_flush_memory(void) { - malloc_trim(0); + if (__context.ops.trim_memory) + __context.ops.trim_memory(__context.data); + return 0; } EXPORT_API int appcore_base_on_receive(aul_type type, bundle *b) { - int ret; - const char **tep_path; - int len = 0; - int i; const char *bg; int dummy = 0; switch (type) { case AUL_START: _DBG("[APP %d] AUL event: AUL_START", getpid()); - tep_path = bundle_get_str_array(b, AUL_TEP_PATH, &len); - if (tep_path) { - for (i = 0; i < len; i++) { - ret = aul_check_tep_mount(tep_path[i]); - if (ret == -1) { - _ERR("mount request not completed within 1 sec"); - exit(-1); - } - } - } - if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT) { bg = bundle_get_val(b, AUL_K_ALLOWED_BG); if (bg && !strcmp(bg, "ALLOWED_BG")) { @@ -1147,6 +1238,7 @@ EXPORT_API int appcore_base_on_receive(aul_type type, bundle *b) EXPORT_API int appcore_base_on_create(void) { int r; + r = aul_launch_init(__context.ops.receive, NULL); if (r < 0) { _ERR("Aul init failed: %d", r); @@ -1176,28 +1268,13 @@ EXPORT_API int appcore_base_on_terminate() EXPORT_API void appcore_base_on_set_event(enum appcore_base_event event) { - int r; - switch (event) { - case APPCORE_BASE_EVENT_LOW_MEMORY: - vconf_notify_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory, NULL); - break; case APPCORE_BASE_EVENT_LOW_BATTERY: vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery, NULL); break; - case APPCORE_BASE_EVENT_LANG_CHANGE: - vconf_notify_key_changed(VCONFKEY_LANGSET, __on_language_change, NULL); - break; case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED: __register_rotation_changed_event(); break; - case APPCORE_BASE_EVENT_REGION_CHANGE: - r = vconf_notify_key_changed(VCONFKEY_REGIONFORMAT, __on_region_change, NULL); - if (r < 0) - break; - - vconf_notify_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __on_region_change, NULL); - break; case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE: break; @@ -1209,27 +1286,13 @@ EXPORT_API void appcore_base_on_set_event(enum appcore_base_event event) EXPORT_API void appcore_base_on_unset_event(enum appcore_base_event event) { - int r; - switch (event) { - case APPCORE_BASE_EVENT_LOW_MEMORY: - vconf_ignore_key_changed(VCONFKEY_SYSMAN_LOW_MEMORY, __on_low_memory); - break; case APPCORE_BASE_EVENT_LOW_BATTERY: vconf_ignore_key_changed(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, __on_low_battery); break; - case APPCORE_BASE_EVENT_LANG_CHANGE: - vconf_ignore_key_changed(VCONFKEY_LANGSET, __on_language_change); - break; case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED: __unregister_rotation_changed_event(); break; - case APPCORE_BASE_EVENT_REGION_CHANGE: - r = vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT, __on_region_change); - if (r < 0) - break; - vconf_ignore_key_changed(VCONFKEY_REGIONFORMAT_TIME1224, __on_region_change); - break; case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE: break; default: @@ -1237,6 +1300,20 @@ EXPORT_API void appcore_base_on_unset_event(enum appcore_base_event event) } } +EXPORT_API int appcore_base_on_trim_memory(void) +{ + int (*sqlite3_free_heap_memory)(int); + + sqlite3_free_heap_memory = dlsym(RTLD_DEFAULT, + "sqlite3_release_memory"); + if (sqlite3_free_heap_memory) + sqlite3_free_heap_memory(SQLITE_FLUSH_MAX); + + malloc_trim(0); + + return 0; +} + EXPORT_API appcore_base_event_h appcore_base_add_event(enum appcore_base_event event, appcore_base_event_cb cb, void *data) { @@ -1318,6 +1395,16 @@ EXPORT_API void appcore_base_exit(void) __context.ops.exit(__context.data); } +EXPORT_API void appcore_base_add_suspend_timer(void) +{ + __add_suspend_timer(); +} + +EXPORT_API void appcore_base_remove_suspend_timer(void) +{ + __remove_suspend_timer(); +} + static int __on_receive(aul_type type, bundle *b, void *data) { return appcore_base_on_receive(type, b); @@ -1345,12 +1432,17 @@ static int __on_set_i18n(void *data) static void __on_set_event(enum appcore_base_event event, void *data) { - return appcore_base_on_set_event(event); + appcore_base_on_set_event(event); } static void __on_unset_event(enum appcore_base_event event, void *data) { - return appcore_base_on_unset_event(event); + appcore_base_on_unset_event(event); +} + +static void __on_trim_memory(void *data) +{ + appcore_base_on_trim_memory(); } EXPORT_API appcore_base_ops appcore_base_get_default_ops(void) @@ -1368,6 +1460,7 @@ EXPORT_API appcore_base_ops appcore_base_get_default_ops(void) ops.exit = NULL; ops.set_event = __on_set_event; ops.unset_event = __on_unset_event; + ops.trim_memory = __on_trim_memory; return ops; }