Check booting status using vconf key 30/232130/3
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 28 Apr 2020 11:09:40 +0000 (20:09 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 29 Apr 2020 01:09:01 +0000 (10:09 +0900)
Change-Id: If39e8a456db13b93d982de8ead9b0ea85e2e3d27
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
packaging/ac.service
src/core/amd_login_monitor.c
src/core/amd_signal.c

index 1560652672dabaae8d95f06951d5ad8a3911ef89..0c1d71cbb5bae1d58e55686bd3f022503341fff9 100644 (file)
@@ -6,7 +6,7 @@
 Description=Start Application Management Daemon
 DefaultDependencies=no
 Requires=dbus.socket tizen-system-env.service
-After=dbus.socket tizen-system-env.service systemd-tmpfiles-setup.service
+After=dbus.socket tizen-system-env.service systemd-tmpfiles-setup.service buxton2.service
 
 [Service]
 User=app_fw
index 29a4cb604080fad8abff20b60aa09abea7eda1a9..51f6ce6dce7f2aebad8f1338d1706fd12689b515 100644 (file)
@@ -27,6 +27,7 @@
 #include <bundle_internal.h>
 #include <aul.h>
 #include <aul_sock.h>
+#include <vconf.h>
 
 #include "amd_util.h"
 #include "amd_login_monitor.h"
@@ -60,6 +61,7 @@ struct login_monitor_s {
        sd_login_monitor *m;
        GIOChannel *io;
        guint sid;
+       bool booting_status;
 };
 
 struct user_s {
@@ -955,12 +957,63 @@ static cynara_checker __cynara_checkers[] = {
        },
 };
 
-static gboolean __login_default_user(gpointer data)
+static void __booting_status_changed_cb(keynode_t *node, void *user_data)
+{
+       int booting_status;
+       struct user_s *user;
+       GList *iter;
+
+       booting_status = vconf_keynode_get_int(node);
+       if (booting_status != login_monitor->booting_status) {
+               _W("Booting status is changed. %d -> %d",
+                               login_monitor->booting_status,
+                               booting_status);
+               login_monitor->booting_status = booting_status;
+               if (booting_status != VCONFKEY_SYSMAN_BOOTING_SUCCESS)
+                       return;
+
+               iter = user_list;
+               while (iter) {
+                       user = (struct user_s *)iter->data;
+                       if (user->state != UID_STATE_ACTIVE &&
+                                       user->state != UID_STATE_CLOSING &&
+                                       user->state != UID_STATE_OFFLINE) {
+                               user->state = UID_STATE_ACTIVE;
+                               __remove_login_timer(user);
+                               __user_login(user);
+                       }
+
+                       iter = g_list_next(iter);
+               }
+       }
+}
+
+static bool __check_system_boot_finished(void)
 {
        bool boot_finished = false;
+       int booting_status;
+       int ret;
+
+       if (login_monitor->booting_status == VCONFKEY_SYSMAN_BOOTING_SUCCESS)
+               return true;
+
+       ret = vconf_get_int(VCONFKEY_SYSMAN_BOOTINGSTATUS, &booting_status);
+       if (ret == 0 && booting_status == VCONFKEY_SYSMAN_BOOTING_SUCCESS) {
+               _W("Booting success");
+               login_monitor->booting_status = booting_status;
+               return true;
+       }
+
+       _signal_check_system_boot_finished(&boot_finished);
+       return boot_finished;
+}
+
+static gboolean __login_default_user(gpointer data)
+{
        struct user_s *user;
        uid_t uid;
 
+       sid = 0;
        __check_user_state();
 
        uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER);
@@ -972,15 +1025,18 @@ static gboolean __login_default_user(gpointer data)
                return G_SOURCE_REMOVE;
        }
 
+       if (user->state == UID_STATE_ACTIVE) {
+               _W("Already active state");
+               return G_SOURCE_REMOVE;
+       }
+
        if (user->state == UID_STATE_UNKNOWN)
                user->state = UID_STATE_OPENING;
 
-       _signal_check_system_boot_finished(&boot_finished);
-       if (boot_finished)
+       if (__check_system_boot_finished())
                user->state = UID_STATE_ACTIVE;
 
        __user_login(user);
-       sid = 0;
        return G_SOURCE_REMOVE;
 }
 
@@ -989,6 +1045,7 @@ int _login_monitor_init(void)
        int r;
        uid_t uid;
        struct user_s *user;
+       int booting_status;
 
        _D("login monitor init");
        if (__init_login_monitor()) {
@@ -997,6 +1054,17 @@ int _login_monitor_init(void)
                return -1;
        }
 
+       r = vconf_get_int(VCONFKEY_SYSMAN_BOOTINGSTATUS, &booting_status);
+       if (r == 0) {
+               _W("booting status(%d)", booting_status);
+               login_monitor->booting_status = booting_status;
+       }
+
+       r = vconf_notify_key_changed(VCONFKEY_SYSMAN_BOOTINGSTATUS,
+                       __booting_status_changed_cb, NULL);
+       if (r != 0)
+               _W("Failed to register callback for checking booting");
+
        _noti_listen(NOTI_MSG_LOGIN_MONITOR_STARTUP_FINISHED,
                        __on_startup_finished);
        _noti_listen(NOTI_MSG_APPINFO_LOAD,
@@ -1057,5 +1125,8 @@ void _login_monitor_fini(void)
        if (user_list)
                g_list_free_full(user_list, __destroy_user);
 
+       vconf_ignore_key_changed(VCONFKEY_SYSMAN_BOOTINGSTATUS,
+                       __booting_status_changed_cb);
+
        __fini_login_monitor();
 }
index 44be9b18ef0d610ee6a5a5ce1a41fc6c9d2b76ed..b92cba0b73439ad2567912094f55caacf0404ee6 100644 (file)
@@ -398,7 +398,7 @@ int _signal_subscribe_startup_finished(int (*callback)(uid_t uid, void *data),
 
        startup_finished_callback = callback;
        startup_finished_data = user_data;
-       _D("[SIGNAL] subscribe startup finished");
+       _W("[SIGNAL] subscribe startup finished");
 
        return 0;
 }
@@ -428,7 +428,7 @@ int _signal_unsubscribe_startup_finished(void)
 
        startup_finished_callback = NULL;
        startup_finished_data = NULL;
-       _D("[SIGNAL] unsubscribe startup finished");
+       _W("[SIGNAL] unsubscribe startup finished");
 
        return 0;
 }