OSDN Git Service

Handled failure of execvp and increases am timeout.
authorFelipe Leme <felipeal@google.com>
Wed, 23 Mar 2016 16:50:11 +0000 (09:50 -0700)
committerThe Android Automerger <android-build@google.com>
Wed, 23 Mar 2016 18:06:29 +0000 (11:06 -0700)
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

cmds/dumpstate/dumpstate.cpp
cmds/dumpstate/utils.cpp

index b391d76..604aea6 100644 (file)
@@ -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
index 89c9653..d07ca8c 100644 (file)
@@ -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<std::string>& 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;