power: handle user session done signal from systemd 40/97440/2
authortaeyoung <ty317.kim@samsung.com>
Mon, 14 Nov 2016 07:32:20 +0000 (16:32 +0900)
committertaeyoung <ty317.kim@samsung.com>
Mon, 14 Nov 2016 07:45:39 +0000 (16:45 +0900)
- Previously, booting-done signal was broadcated
  if system session is done.

- Now, deviced receives the user session done signal
  from systemd. Thus booting-done signal is broadcasted
  if both system and user session are done.

Change-Id: I92b5c5ca4ef992f282c5824c5e3f0b82a4b6129d
Signed-off-by: taeyoung <ty317.kim@samsung.com>
src/power/boot.c

index 33a72ce..623add9 100644 (file)
@@ -30,7 +30,8 @@
 
 #define SIGNAL_BOOTING_DONE            "BootingDone"
 
-#define SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED "StartupFinished"
+#define SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED "StartupFinished"
+#define SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED   "UserSessionStartupFinished"
 #define SYSTEMD_DBUS_METHOD_SYSTEM_STATE     "SystemState"
 #define SYSTEMD_STATE_RUNNING                "running"
 #define SYSTEMD_STATE_DEGRADED               "degraded"
@@ -81,28 +82,42 @@ void remove_booting_done_handler(void *data)
 {
        unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
                        SYSTEMD_DBUS_IFACE_MANAGER,
-                       SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED);
+                       SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED);
+       unregister_edbus_signal_handler(SYSTEMD_DBUS_PATH,
+                       SYSTEMD_DBUS_IFACE_MANAGER,
+                       SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED);
 }
 
 static void booting_done_received(void *data, DBusMessage *msg)
 {
-       static int done = 0;
+       static int system_done = 0;
+       static int user_done = 0;
+
+       if (dbus_message_is_signal(msg, SYSTEMD_DBUS_IFACE_MANAGER,
+                               SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED)) {
+               if (system_done)
+                       return;
+
+               system_done = booting_finished();
+               if (system_done == 0) {
+                       _E("System Session is not ready yet");
+                       return;
+               }
+               _I("System Session is Ready");
+               device_notify(DEVICE_NOTIFIER_BOOTING_DONE, &system_done);
+       }
 
-       if (!dbus_message_is_signal(msg, SYSTEMD_DBUS_IFACE_MANAGER,
-                               SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED)) {
-               _E("there is no StartupFinished signal");
-               return;
+       else if (dbus_message_is_signal(msg, SYSTEMD_DBUS_IFACE_MANAGER,
+                               SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED)) {
+               if (user_done)
+                       return;
+               user_done = 1;
+               _I("User Session is Ready");
        }
 
-       if (done)
+       if (!system_done || !user_done)
                return;
 
-       done = booting_finished();
-       if (done != TRUE) {
-               _E("Booting is not finished");
-               return;
-       }
-
        remove_booting_done_handler(NULL);
 
        _I("real booting done, unlock LCD_OFF");
@@ -115,15 +130,18 @@ static void booting_done_received(void *data, DBusMessage *msg)
                        NULL, NULL);
 
        boot_complete_send_system_event();
-
-       device_notify(DEVICE_NOTIFIER_BOOTING_DONE, &done);
 }
 
 void add_booting_done_handler(void *data)
 {
-       /* Normal booting done: System Session is loaded completely */
+       /* System Session is loaded completely */
+       register_edbus_signal_handler(SYSTEMD_DBUS_PATH,
+                   SYSTEMD_DBUS_IFACE_MANAGER,
+                   SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED,
+                   booting_done_received);
+       /* User Session is loaded completely */
        register_edbus_signal_handler(SYSTEMD_DBUS_PATH,
                    SYSTEMD_DBUS_IFACE_MANAGER,
-                   SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED,
+                   SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED,
                    booting_done_received);
 }