From: Hyungju Lee Date: Fri, 11 Oct 2019 07:05:31 +0000 (+0900) Subject: Fix candidate start bug on hydra mode X-Git-Tag: accepted/tizen/unified/20191014.005007~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F85%2F215585%2F1;p=platform%2Fcore%2Fappfw%2Flaunchpad.git Fix candidate start bug on hydra mode Change-Id: I3d71eeb7606cd73b8b251dd6bbc0f52fce3651da --- diff --git a/src/launchpad_lib.c b/src/launchpad_lib.c index c3f41d8..24532b9 100644 --- a/src/launchpad_lib.c +++ b/src/launchpad_lib.c @@ -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;