From: Geunsun, Lee Date: Wed, 3 Aug 2016 12:00:13 +0000 (+0900) Subject: Implement lazy mount X-Git-Tag: accepted/tizen/common/20160822.132733^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c65e7622d3cc079320434e62d146eb83c6e4c3f4;p=apps%2Fnative%2Fstarter.git Implement lazy mount Change-Id: If4fffd9d3a3bb68c4f5f7e27e194c84550d47efd --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 638196f..04a00d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,8 @@ pkg_check_modules(pkgs REQUIRED tts capi-message-port efl-extension + liblazymount + libsystemd-daemon ) ELSEIF("${TIZEN_PROFILE_NAME}" STREQUAL "WEARABLE") @@ -131,6 +133,8 @@ pkg_check_modules(pkgs REQUIRED edbus dbus-1 dbus-glib-1 + liblazymount + libsystemd-daemon ) ENDIF() diff --git a/include/dbus_util.h b/include/dbus_util.h index f4343df..9ab0bc5 100644 --- a/include/dbus_util.h +++ b/include/dbus_util.h @@ -39,12 +39,21 @@ #define MEMBER_LCD_ON "LCDOn" #define MEMBER_LCD_OFF "LCDOff" +#define SYS_LOCK_BUS_NAME "org.tizen.syslock" +#define SYS_LOCK_OBJECT_PATH "/Org/Tizen/System/Syslock" +#define SYS_LOCK_INTERFACE_UNLOCK SYS_LOCK_BUS_NAME".unlock" +#define SYS_LOCK_INTERFACE_TERMINATE SYS_LOCK_BUS_NAME".terminate" +#define SYS_LOCK_MEMBER_UNLOCK "unlock" +#define SYS_LOCK_MEMBER_TERMINATE "terminate" + extern int dbus_util_send_oomadj(int pid, int oom_adj_value); extern void dbus_util_send_cpu_booster_signal(void); extern void dbus_util_send_poweroff_signal(void); extern void dbus_util_send_lock_PmQos_signal(void); +extern void dbus_util_send_sys_lock_teminate_signal(void); extern int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data); +extern int dbus_util_receive_sys_lock_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data); extern char *dbus_util_msg_arg_get_str(DBusMessage *msg); #endif //__DBUS_UTIL_H__ diff --git a/packaging/starter.path b/packaging/starter.path deleted file mode 100644 index 5abc563..0000000 --- a/packaging/starter.path +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=Start the "starter" program - -[Path] -PathExists=/run/.wm_ready diff --git a/packaging/starter.service b/packaging/starter.service index b6e9a9f..bddb142 100644 --- a/packaging/starter.service +++ b/packaging/starter.service @@ -1,6 +1,7 @@ [Unit] Description=Start the "starter" program -After=ac.service +DefaultDependencies=no +After=ac.service efl-config.service enlightenment-user.service [Service] EnvironmentFile=/run/tizen-system-env @@ -8,6 +9,4 @@ ExecStart=/usr/bin/starter Restart=always RestartSec=0 KillSignal=SIGKILL - -[Install] -WantedBy=tizen-system.target +Type=notify diff --git a/packaging/starter.spec b/packaging/starter.spec index ffc9e36..c5b4d84 100644 --- a/packaging/starter.spec +++ b/packaging/starter.spec @@ -9,7 +9,6 @@ Group: Applications/Core Applications License: Apache-2.0 Source0: %{name}-%{version}.tar.gz Source1: %{name}.service -Source2: %{name}.path %if "%{profile}" == "tv" || "%{profile}" == "ivi" ExcludeArch: %{arm} %ix86 x86_64 @@ -23,6 +22,8 @@ BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-system-media-key) BuildRequires: pkgconfig(capi-network-bluetooth) BuildRequires: pkgconfig(capi-system-system-settings) +BuildRequires: pkgconfig(liblazymount) +BuildRequires: pkgconfig(libsystemd-daemon) %if "%{profile}" == "common" BuildRequires: tts @@ -129,13 +130,11 @@ make -j1 rm -rf %{buildroot} %make_install -mkdir -p %{buildroot}%{__usrdir}/default.target.wants +mkdir -p %{buildroot}%{__usrdir}/basic.target.wants mkdir -p %{buildroot}%{_sysconfdir}/systemd/default-extra-dependencies/ignore-units.d/ install -m 0644 %SOURCE1 %{buildroot}%{__usrdir}/starter.service - -install -m 0644 %SOURCE2 %{buildroot}%{__usrdir}/starter.path -ln -s ../starter.path %{buildroot}%{__usrdir}/default.target.wants/starter.path +ln -s ../starter.service %{buildroot}%{__usrdir}/basic.target.wants/starter.service mkdir -p %{buildroot}/usr/share/license cp -f LICENSE %{buildroot}/usr/share/license/%{name} @@ -151,6 +150,5 @@ sync %defattr(-,root,root,-) %{_bindir}/starter %{__usrdir}/starter.service -%{__usrdir}/starter.path -%{__usrdir}/default.target.wants/starter.path +%{__usrdir}/basic.target.wants/starter.service /usr/share/license/%{name} diff --git a/src/dbus_util.c b/src/dbus_util.c index b9f0547..a01438f 100644 --- a/src/dbus_util.c +++ b/src/dbus_util.c @@ -21,11 +21,6 @@ #include "dbus_util.h" #include "util.h" -#define DBUS_HOME_BUS_NAME "org.tizen.coreapps.home" -#define DBUS_HOME_RAISE_PATH "/Org/Tizen/Coreapps/home/raise" -#define DBUS_HOME_RAISE_INTERFACE DBUS_HOME_BUS_NAME".raise" -#define DBUS_HOME_RAISE_MEMBER "homeraise" - #define DBUS_REPLY_TIMEOUT (120 * 1000) #define POWEROFF_BUS_NAME "org.tizen.system.popup" @@ -327,13 +322,38 @@ void dbus_util_send_lock_PmQos_signal(void) +void dbus_util_send_sys_lock_teminate_signal(void) +{ + E_DBus_Connection *conn; + DBusMessage *msg; + int ret = 1; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (conn == NULL) { + _E("e_dbus_bus_get error"); + } + + msg = dbus_message_new_signal(SYS_LOCK_OBJECT_PATH, + SYS_LOCK_INTERFACE_TERMINATE, + SYS_LOCK_MEMBER_TERMINATE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &ret, + DBUS_TYPE_INVALID); + + e_dbus_message_send(conn, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + _D("%s-%s", SYS_LOCK_INTERFACE_TERMINATE, SYS_LOCK_MEMBER_TERMINATE); +} + + + int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data) { E_DBus_Connection *conn; E_DBus_Signal_Handler *handler; - e_dbus_init(); - conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); if (conn == NULL) { _E("e_dbus_bus_get error"); @@ -359,6 +379,30 @@ int dbus_util_receive_lcd_status(void (*changed_cb)(void *data, DBusMessage *msg return 1; } + + +int dbus_util_receive_sys_lock_status(void (*changed_cb)(void *data, DBusMessage *msg), void *data) +{ + E_DBus_Connection *conn; + E_DBus_Signal_Handler *handler; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (conn == NULL) { + _E("e_dbus_bus_get error"); + return -1; + } + + handler = e_dbus_signal_handler_add(conn, NULL, SYS_LOCK_OBJECT_PATH, + SYS_LOCK_INTERFACE_UNLOCK, SYS_LOCK_MEMBER_UNLOCK, + changed_cb, data); + if (handler == NULL) { + _E("e_dbus_signal_handler_add error"); + return -1; + } + + return 0; +} + char *dbus_util_msg_arg_get_str(DBusMessage *msg) { int ret = 0; @@ -379,6 +423,3 @@ ERROR: return NULL; } - - - diff --git a/src/mobile/starter.c b/src/mobile/starter.c index 2a92777..3f68ca0 100755 --- a/src/mobile/starter.c +++ b/src/mobile/starter.c @@ -24,6 +24,10 @@ #include #include +#include +#include +#include + #include #include #include @@ -36,7 +40,9 @@ #include "util.h" #include "status.h" #include "hw_key.h" +#include "dbus_util.h" +#define APPID_SYS_LOCK "org.tizen.sys-lock" #if 0 @@ -193,16 +199,77 @@ static int _check_dead_signal(int pid, void *data) +static void _mount_and_launch_apps(void) +{ + int ret = 0; + + /* + * Do mount user data partition + */ + ret = do_mount_user(); + if (ret != 0) { + _E("Failed to do mount [/opt] area"); + return; + } + + /* + * Wait user data partition mount + */ + ret = wait_mount_user(); + if (ret != 0) { + _E("Failed to wait mount [/opt] area"); + return; + } + + /* Tells the service manager that service startup is finished */ + sd_notify(0, "READY=1"); + + /* + * After user data partition mount, + * launch lockscreen, homescreen, etc. + */ + hw_key_create_window(); + + lock_mgr_init(); + home_mgr_init(NULL); + + _show_home(); +} + + + +static void _sys_lock_status_changed_cb(void *data, DBusMessage *msg) +{ + int is_unlock = 0; + + is_unlock = dbus_message_is_signal(msg, SYS_LOCK_INTERFACE_UNLOCK, SYS_LOCK_MEMBER_UNLOCK); + + _D("sys-lock signal is received. unlock state(%d).", is_unlock); + + if (is_unlock) { + _mount_and_launch_apps(); + + /* + * Send DBus signal to terminate sys-lock + */ + dbus_util_send_sys_lock_teminate_signal(); + } +} + + + static void _init(struct appdata *ad) { struct sigaction act; - char err_buf[128] = {0,}; + char err_buf[128] = { 0, }; + int is_lazy_mount = 0; + int ret = 0; memset(&act,0x00,sizeof(struct sigaction)); act.sa_sigaction = _signal_handler; act.sa_flags = SA_SIGINFO; - int ret = sigemptyset(&act.sa_mask); + ret = sigemptyset(&act.sa_mask); if (ret < 0) { if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) { _E("Failed to sigemptyset[%d / %s]", errno, err_buf); @@ -226,12 +293,23 @@ static void _init(struct appdata *ad) status_register(); status_active_register_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb, NULL); - hw_key_create_window(); + e_dbus_init(); - lock_mgr_init(); - home_mgr_init(NULL); + is_lazy_mount = get_need_ui_for_lazy_mount(); + _D("Lazy mount : %d", is_lazy_mount); + if (is_lazy_mount) { + /* + * Launch Sys-lock + */ + process_mgr_must_launch(APPID_SYS_LOCK, NULL, NULL, NULL, NULL); - _show_home(); + /* + * Register sys-lock status changed cb + */ + dbus_util_receive_sys_lock_status(_sys_lock_status_changed_cb, NULL); + } else { + _mount_and_launch_apps(); + } aul_listen_app_dead_signal(_check_dead_signal, NULL); } @@ -245,6 +323,8 @@ static void _fini(struct appdata *ad) home_mgr_fini(); lock_mgr_fini(); + e_dbus_shutdown(); + status_active_unregister_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb); status_unregister(); diff --git a/src/wearable/starter.c b/src/wearable/starter.c index d25449a..0a3a5a9 100755 --- a/src/wearable/starter.c +++ b/src/wearable/starter.c @@ -29,6 +29,9 @@ #include #include +#include +#include + #include "hw_key.h" #include "util.h" #include "hourly_alert.h" @@ -125,12 +128,13 @@ static void _init(void) { struct sigaction act; char err_buf[128] = {0,}; + int ret = 0; memset(&act,0x00,sizeof(struct sigaction)); act.sa_sigaction = _signal_handler; act.sa_flags = SA_SIGINFO; - int ret = sigemptyset(&act.sa_mask); + ret = sigemptyset(&act.sa_mask); if (ret < 0) { if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) { _E("Failed to sigemptyset[%d / %s]", errno, err_buf); @@ -153,6 +157,9 @@ static void _init(void) status_active_register_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb, NULL); status_active_register_cb(STATUS_ACTIVE_KEY_LANGSET, _change_language_cb, NULL); + /* Tells the service manager that service startup is finished */ + sd_notify(0, "READY=1"); + home_mgr_launch_home(); dbus_util_receive_lcd_status(_on_lcd_changed_receive, NULL);