Implement lazy mount 84/82484/7
authorGeunsun, Lee <gs86.lee@samsung.com>
Wed, 3 Aug 2016 12:00:13 +0000 (21:00 +0900)
committerGeunsun, Lee <gs86.lee@samsung.com>
Fri, 19 Aug 2016 07:33:30 +0000 (16:33 +0900)
Change-Id: If4fffd9d3a3bb68c4f5f7e27e194c84550d47efd

CMakeLists.txt
include/dbus_util.h
packaging/starter.path [deleted file]
packaging/starter.service
packaging/starter.spec
src/dbus_util.c
src/mobile/starter.c
src/wearable/starter.c

index 638196f..04a00d5 100644 (file)
@@ -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()
index f4343df..9ab0bc5 100644 (file)
 #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 (file)
index 5abc563..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[Unit]
-Description=Start the "starter" program
-
-[Path]
-PathExists=/run/.wm_ready
index b6e9a9f..bddb142 100644 (file)
@@ -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
index ffc9e36..c5b4d84 100644 (file)
@@ -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}
index b9f0547..a01438f 100644 (file)
 #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;
 }
-
-
-
index 2a92777..3f68ca0 100755 (executable)
 #include <string.h>
 #include <malloc.h>
 
+#include <E_DBus.h>
+#include <lazy_mount.h>
+#include <systemd/sd-daemon.h>
+
 #include <aul.h>
 #include <vconf.h>
 #include <signal.h>
@@ -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();
 
index d25449a..0a3a5a9 100755 (executable)
@@ -29,6 +29,9 @@
 #include <Ecore_Wayland.h>
 #include <malloc.h>
 
+#include <lazy_mount.h>
+#include <systemd/sd-daemon.h>
+
 #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);