From: Felipe Leme Date: Wed, 23 Mar 2016 16:50:11 +0000 (-0700) Subject: Handled failure of execvp and increases am timeout. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b46c7f98359ef83eb4345814235f951f68eb477d;p=android-x86%2Fframeworks-native.git Handled failure of execvp and increases am timeout. The run_command_always() call fork and runs the command in the child code, and user to have the above logic: if (pid == 0) { // boiling code execvp(command, (char**) args); // execvp's result will be handled after waitpid_with_timeout() below... _exit(-1); // ...but it doesn't hurt to force exit, just in case } Recently, the _exit(-1) line was removed and there's been reports of dumpstate hanging after, because it tries to wait for pid 0 to finish (and in some cases it even tries to kill it). Also increased the timeout when running am to send broadcasts. BUG: 27804637 BUG: 27809534 Change-Id: Ia129253e367e5886d305947e56a643fd660a33bd --- diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index b391d76e2f..604aea687c 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -198,6 +198,9 @@ static void dump_systrace() { // The drawback of calling execl directly is that we're not timing out if it hangs. MYLOGD("Running '/system/bin/atrace --async_dump', which can take several seconds"); execl("/system/bin/atrace", "/system/bin/atrace", "--async_dump", nullptr); + // execl should never return, but it doesn't hurt to handle that scenario + MYLOGD("execl on '/system/bin/atrace --async_dump' returned control"); + _exit(-1); } else { close(pipefd[1]); // close the write end of the pipe in the parent add_zip_entry_from_fd("systrace.txt", pipefd[0]); // write output to zip file diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp index 89c9653e37..d07ca8c37d 100644 --- a/cmds/dumpstate/utils.cpp +++ b/cmds/dumpstate/utils.cpp @@ -737,6 +737,8 @@ int run_command_always(const char *title, bool drop_root, int timeout_seconds, c execvp(command, (char**) args); // execvp's result will be handled after waitpid_with_timeout() below... + MYLOGD("execvp on command %s (plus args) returned control; calling _exit(-1)", command) + _exit(-1); // ...but it doesn't hurt to force exit, just in case } /* handle parent case */ @@ -848,7 +850,7 @@ void send_broadcast(const std::string& action, const std::vector& a std::string args_string; format_args(am_index + 1, am_args, &args_string); MYLOGD("send_broadcast command: %s\n", args_string.c_str()); - run_command_always(NULL, 5, true, am_args); + run_command_always(NULL, 20, true, am_args); } size_t num_props = 0;