summaryrefslogtreecommitdiff
path: root/runtime/exec_utils.h
diff options
context:
space:
mode:
author Jiakai Zhang <jiakaiz@google.com> 2022-06-29 17:09:51 +0100
committer Treehugger Robot <treehugger-gerrit@google.com> 2022-07-04 16:25:06 +0000
commitf0061f62fbd5e4766220c154d914e7b9d07a86eb (patch)
tree28aa2f340a2436172d4995451d945eb7703488f8 /runtime/exec_utils.h
parentf5970c3ffc4aebc8e33f91370d55586ee446f501 (diff)
Update ExecUtils to support artd use cases.
- Use pidfd_open/poll instaed of sigprocmask/sigtimedwait to implement executing a command with a timeout because sigprocmask/sigtimedwait does not support multithreaded program, while artd is multithreaded. The same approach is used in installd in https://r.android.com/1993670. - Add "const" to the `std::vector<std::string>& arg_vector` parameter. - Use "int" instead of "time_t" for the "timeout_sec" parameter because "time_t" represents the time since epoch rather than a duration. - Set an error message with the signal number when the subprocess is terminated by a signal. - Crash the subprocess instead of exiting it with an exit code when execv fails. The behavior does not change. ExecUtilsTest is still passing. Bug: 229268202 Test: m test-art-host-gtest-art_runtime_tests Test: atest ArtGtestsTargetChroot:ExecUtilsTest Change-Id: I375034162cded6fdf09ee4d4cd783a0d3987af49 Merged-In: I375034162cded6fdf09ee4d4cd783a0d3987af49 (cherry picked from commit b48b732c535894bbae8f3c19eceeda67c40e9d61)
Diffstat (limited to 'runtime/exec_utils.h')
-rw-r--r--runtime/exec_utils.h19
1 files changed, 10 insertions, 9 deletions
diff --git a/runtime/exec_utils.h b/runtime/exec_utils.h
index 7ce0a9c20a..ff90ebdfb3 100644
--- a/runtime/exec_utils.h
+++ b/runtime/exec_utils.h
@@ -29,13 +29,13 @@ namespace art {
// of the runtime (Runtime::Current()) was started. If no instance of the runtime was started, it
// will use the current environment settings.
-bool Exec(std::vector<std::string>& arg_vector, /*out*/ std::string* error_msg);
-int ExecAndReturnCode(std::vector<std::string>& arg_vector, /*out*/ std::string* error_msg);
+bool Exec(const std::vector<std::string>& arg_vector, /*out*/ std::string* error_msg);
+int ExecAndReturnCode(const std::vector<std::string>& arg_vector, /*out*/ std::string* error_msg);
// Execute the command specified in `argv_vector` in a subprocess with a timeout.
// Returns the process exit code on success, -1 otherwise.
-int ExecAndReturnCode(std::vector<std::string>& arg_vector,
- time_t timeout_secs,
+int ExecAndReturnCode(const std::vector<std::string>& arg_vector,
+ int timeout_sec,
/*out*/ bool* timed_out,
/*out*/ std::string* error_msg);
@@ -44,20 +44,21 @@ class ExecUtils {
public:
virtual ~ExecUtils() = default;
- virtual bool Exec(std::vector<std::string>& arg_vector, /*out*/ std::string* error_msg) const {
+ virtual bool Exec(const std::vector<std::string>& arg_vector,
+ /*out*/ std::string* error_msg) const {
return art::Exec(arg_vector, error_msg);
}
- virtual int ExecAndReturnCode(std::vector<std::string>& arg_vector,
+ virtual int ExecAndReturnCode(const std::vector<std::string>& arg_vector,
/*out*/ std::string* error_msg) const {
return art::ExecAndReturnCode(arg_vector, error_msg);
}
- virtual int ExecAndReturnCode(std::vector<std::string>& arg_vector,
- time_t timeout_secs,
+ virtual int ExecAndReturnCode(const std::vector<std::string>& arg_vector,
+ int timeout_sec,
/*out*/ bool* timed_out,
/*out*/ std::string* error_msg) const {
- return art::ExecAndReturnCode(arg_vector, timeout_secs, timed_out, error_msg);
+ return art::ExecAndReturnCode(arg_vector, timeout_sec, timed_out, error_msg);
}
};