summaryrefslogtreecommitdiff
path: root/simpleperf/cmd_api.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/cmd_api.cpp')
-rw-r--r--simpleperf/cmd_api.cpp84
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