Fix candidate start bug on hydra mode 85/215585/1
authorHyungju Lee <leee.lee@samsung.com>
Fri, 11 Oct 2019 07:05:31 +0000 (16:05 +0900)
committerHyungju Lee <leee.lee@samsung.com>
Fri, 11 Oct 2019 07:05:31 +0000 (16:05 +0900)
Change-Id: I3d71eeb7606cd73b8b251dd6bbc0f52fce3651da

src/launchpad_lib.c

index c3f41d8..24532b9 100644 (file)
@@ -55,6 +55,7 @@ static int __loader_id;
 static pid_t __candidate_pid = -1;
 static struct sigaction __prev_sigchld;
 static bool __loop_quit;
+static bool __is_candidate = false;
 
 static void __at_exit_to_release_bundle(void)
 {
@@ -320,7 +321,6 @@ static void __hydra_receiver_cb(int fd)
        enum hydra_cmd cmd = -1;
        int len;
        pid_t pid;
-       int r;
 
        _D("[hydra] ECORE_FD_READ");
 
@@ -352,12 +352,15 @@ retry_recv:
                _E("[hydra] unable to fork: %s",
                        strerror_r(errno, err_str, sizeof(err_str)));
        } else if (pid > 0) {
-               SECURE_LOGD("[hydra] forked candidate with pid=%d", pid);
+               SECURE_LOGD("[hydra] forked new candidate with pid=%d", pid);
 
                __candidate_pid = pid;
+               __is_candidate = false;
 
                return;
        } else {
+               __is_candidate = true;
+
                if (sigaction(SIGCHLD, &__prev_sigchld, NULL)) {
                        _E("[hydra] sigaction failed: %s",
                                strerror_r(errno, err_str, sizeof(err_str)));
@@ -373,15 +376,7 @@ retry_recv:
 
                __loader_adapter->loop_quit(__loader_user_data);
 
-               if (__hydra_callbacks->terminate)
-                       __hydra_callbacks->terminate(__loader_user_data);
-
-               r = launchpad_loader_main(__argc, __argv, __loader_callbacks,
-                               __loader_adapter, __loader_user_data);
-               if (r != 0)
-                       _E("[hydra] launchpad_loader_main failed. Error: %d", r);
-
-               exit(r);
+               return;
        }
 
 err:
@@ -572,6 +567,7 @@ API int launchpad_hydra_main(int argc, char **argv,
        int loader_type;
        int loader_id;
        int client_fd;
+       int r = -1;
        pid_t pid;
        struct sigaction new_act;
 
@@ -650,8 +646,12 @@ API int launchpad_hydra_main(int argc, char **argv,
                if (hydra_callbacks->fork)
                        hydra_callbacks->fork(user_data);
 
-               return launchpad_loader_main(argc, argv, callbacks,
-                               adapter, user_data);
+               r = launchpad_loader_main(argc, argv, callbacks, adapter, user_data);
+
+               if (r != 0)
+                       _E("[hydra] launchpad_loader_main failed. Error: %d", r);
+
+               return r;
        } else {
                __hydra_callbacks = hydra_callbacks;
                __loader_callbacks = callbacks;
@@ -681,10 +681,19 @@ API int launchpad_hydra_main(int argc, char **argv,
 
                __loader_adapter->loop_begin(__loader_user_data);
 
+               /* At this point, either end of hydra process or start of candidate process main loop */
                if (__hydra_callbacks->terminate)
-                       return __hydra_callbacks->terminate(__loader_user_data);
+                       r = __hydra_callbacks->terminate(__loader_user_data);
 
-               return -1;
+               if (__is_candidate) {
+                       r = launchpad_loader_main(__argc, __argv, __loader_callbacks,
+                                       __loader_adapter, __loader_user_data);
+
+                       if (r != 0)
+                         _E("[hydra] launchpad_loader_main failed. Error: %d", r);
+               }
+
+               return r;
        }
 
        return 0;