diff options
Diffstat (limited to 'simpleperf/cmd_api.cpp')
-rw-r--r-- | simpleperf/cmd_api.cpp | 84 |
1 files changed, 38 insertions, 46 deletions
diff --git a/simpleperf/cmd_api.cpp b/simpleperf/cmd_api.cpp index 7f933736..736f239c 100644 --- a/simpleperf/cmd_api.cpp +++ b/simpleperf/cmd_api.cpp @@ -28,21 +28,23 @@ #include <android-base/unique_fd.h> #include <ziparchive/zip_writer.h> +#include "cmd_api_impl.h" #include "command.h" -#include "event_type.h" #include "environment.h" +#include "event_type.h" #include "utils.h" #include "workload.h" +namespace simpleperf { namespace { + const std::string SIMPLEPERF_DATA_DIR = "simpleperf_data"; class PrepareCommand : public Command { public: PrepareCommand() - : Command("api-prepare", "Prepare recording via app api", - "Usage: simpleperf api-prepare\n" - ) {} + : Command("api-prepare", "Prepare recording via app api", "Usage: simpleperf api-prepare\n") { + } bool Run(const std::vector<std::string>& args); }; @@ -52,12 +54,7 @@ bool PrepareCommand::Run(const std::vector<std::string>&) { return false; } // Create tracepoint_events file. - if (!android::base::WriteStringToFile(GetTracepointEvents(), - "/data/local/tmp/tracepoint_events")) { - PLOG(ERROR) << "failed to write tracepoint_events file"; - return false; - } - return true; + return EventTypeManager::Instance().WriteTracepointsToFile("/data/local/tmp/tracepoint_events"); } class CollectCommand : public Command { @@ -76,7 +73,8 @@ class CollectCommand : public Command { "--stop-signal-fd <fd> Stop recording when fd is readable.\n" #endif // clang-format on - ) {} + ) { + } bool Run(const std::vector<std::string>& args); private: @@ -104,36 +102,30 @@ bool CollectCommand::Run(const std::vector<std::string>& args) { } bool CollectCommand::ParseOptions(const std::vector<std::string>& args) { - for (size_t i = 0; i < args.size(); ++i) { - if (args[i] == "--app") { - if (!NextArgumentOrError(args, &i)) { - return false; - } - app_name_ = args[i]; - } else if (args[i] == "--in-app") { - in_app_context_ = true; - } else if (args[i] == "-o") { - if (!NextArgumentOrError(args, &i)) { - return false; - } - output_filepath_ = args[i]; - } else if (args[i] == "--out-fd") { - int fd; - if (!GetUintOption(args, &i, &fd)) { - return false; - } - out_fd_.reset(fd); - } else if (args[i] == "--stop-signal-fd") { - int fd; - if (!GetUintOption(args, &i, &fd)) { - return false; - } - stop_signal_fd_.reset(fd); - } else { - ReportUnknownOption(args, i); - return false; - } + OptionValueMap options; + std::vector<std::pair<OptionName, OptionValue>> ordered_options; + if (!PreprocessOptions(args, GetApiCollectCmdOptionFormats(), &options, &ordered_options, + nullptr)) { + return false; + } + + if (auto value = options.PullValue("--app"); value) { + app_name_ = *value->str_value; } + in_app_context_ = options.PullBoolValue("--in-app"); + + if (auto value = options.PullValue("-o"); value) { + output_filepath_ = *value->str_value; + } + if (auto value = options.PullValue("--out-fd"); value) { + out_fd_.reset(static_cast<int>(value->uint_value)); + } + if (auto value = options.PullValue("--stop-signal-fd"); value) { + stop_signal_fd_.reset(static_cast<int>(value->uint_value)); + } + + CHECK(options.values.empty()); + CHECK(ordered_options.empty()); if (!in_app_context_) { if (app_name_.empty()) { LOG(ERROR) << "--app is missing"; @@ -154,8 +146,8 @@ void CollectCommand::HandleStopSignal() { } bool CollectCommand::CollectRecordingData() { - std::unique_ptr<FILE, decltype(&fclose)> fp(android::base::Fdopen(std::move(out_fd_), "w"), - fclose); + std::unique_ptr<FILE, decltype(&fclose)> fp(android::base::Fdopen(std::move(out_fd_), "w"), + fclose); if (fp == nullptr) { PLOG(ERROR) << "failed to call fdopen"; return false; @@ -216,8 +208,8 @@ bool CollectCommand::RemoveRecordingData() { } // namespace void RegisterAPICommands() { - RegisterCommand("api-prepare", - []{ return std::unique_ptr<Command>(new PrepareCommand()); }); - RegisterCommand("api-collect", - []{ return std::unique_ptr<Command>(new CollectCommand()); }); + RegisterCommand("api-prepare", [] { return std::unique_ptr<Command>(new PrepareCommand()); }); + RegisterCommand("api-collect", [] { return std::unique_ptr<Command>(new CollectCommand()); }); } + +} // namespace simpleperf |