X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fbase%2Fappcore_base.c;h=3795ee353952655935aa1e60ab93d5639798019c;hb=0397903f585e1338fd3e1e035605b4751b871d1f;hp=ca9c79c30dab7ae314c1446c315c8ae8c52e6172;hpb=4a1bdeac581bd96692981fa82e127e79dbb0e131;p=platform%2Fcore%2Fappfw%2Fapp-core.git diff --git a/src/base/appcore_base.c b/src/base/appcore_base.c index ca9c79c..3795ee3 100644 --- a/src/base/appcore_base.c +++ b/src/base/appcore_base.c @@ -38,13 +38,17 @@ #include #include #include + #include "appcore_base.h" #include "appcore_base_private.h" +#include "appcore_watchdog.h" +#include "appcore_base_control.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; @@ -56,6 +60,7 @@ typedef struct _appcore_base_context { bool allowed_bg; bool dirty; guint sid; + int display_state; } appcore_base_context; typedef struct _appcore_base_event_node { @@ -69,6 +74,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 +249,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 +260,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 +300,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++; } @@ -615,11 +670,19 @@ static void __update_lang(void) } setenv("LANG", lang, 1); setenv("LC_MESSAGES", lang, 1); + setenv("LC_ALL", lang, 1); 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 +707,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 +796,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) { @@ -829,6 +901,12 @@ static void __fini_suspend_dbus_handler(void) __bus = NULL; } +static gboolean __init_suspend(gpointer data) +{ + __init_suspend_dbus_handler(); + return G_SOURCE_REMOVE; +} + static int __get_locale_resource_dir(char *locale_dir, int size) { const char *res_path; @@ -889,10 +967,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) @@ -944,6 +1029,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; @@ -961,7 +1068,7 @@ EXPORT_API int appcore_base_init(appcore_base_ops ops, int argc, char **argv, vo __context.ops.init(argc, argv, data); if (TIZEN_FEATURE_BACKGROUND_MANAGEMENT) - __init_suspend_dbus_handler(); + g_idle_add(__init_suspend, NULL); if (!__context.dirty) { __context.dirty = true; @@ -975,6 +1082,7 @@ 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); @@ -999,6 +1107,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); @@ -1012,6 +1121,9 @@ EXPORT_API void appcore_base_fini(void) } } + appcore_base_control_fini(); + __unset_default_events(); + if (__context.sid) { g_source_remove(__context.sid); __context.sid = 0; @@ -1036,33 +1148,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")) { @@ -1098,8 +1197,10 @@ EXPORT_API int appcore_base_on_receive(aul_type type, bundle *b) if (__context.ops.exit) __context.ops.exit(__context.data); break; + case AUL_TERMINATE_INST: + case AUL_TERMINATE_BG_INST: case AUL_TERMINATE_BGAPP: - _DBG("[APP %d] AUL event: AUL_TERMINATE_BGAPP", getpid()); + _DBG("[APP %d] AUL event: %d", getpid(), type); if (!__context.allowed_bg) __remove_suspend_timer(); break; @@ -1141,7 +1242,8 @@ 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); + + r = aul_launch_init(__context.ops.receive, __context.data); if (r < 0) { _ERR("Aul init failed: %d", r); return -1; @@ -1158,6 +1260,8 @@ EXPORT_API int appcore_base_on_create(void) EXPORT_API int appcore_base_on_control(bundle *b) { + appcore_base_control_invoke(b); + return 0; } @@ -1170,28 +1274,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; @@ -1203,27 +1292,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: @@ -1231,6 +1306,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) { @@ -1312,6 +1401,26 @@ 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(); +} + +EXPORT_API void appcore_base_set_display_state(int display_state) +{ + __context.display_state = display_state; +} + +EXPORT_API int appcore_base_get_display_state(void) +{ + return __context.display_state; +} + static int __on_receive(aul_type type, bundle *b, void *data) { return appcore_base_on_receive(type, b); @@ -1339,12 +1448,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) @@ -1362,6 +1476,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; }