diff options
author | 2022-06-29 17:09:51 +0100 | |
---|---|---|
committer | 2022-07-04 16:25:06 +0000 | |
commit | f0061f62fbd5e4766220c154d914e7b9d07a86eb (patch) | |
tree | 28aa2f340a2436172d4995451d945eb7703488f8 /runtime/exec_utils.h | |
parent | f5970c3ffc4aebc8e33f91370d55586ee446f501 (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.h | 19 |
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); } }; |