summaryrefslogtreecommitdiff
path: root/perfprofd/binder_interface/perfprofd_binder.cc
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-04-03 07:20:45 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-04-03 07:20:45 +0000
commit9f9aae3f12c5e5c93820e3a0ffc7f156b92c440f (patch)
treee05d62d664799d4782422f9f7ee72f2c7cda17d7 /perfprofd/binder_interface/perfprofd_binder.cc
parentd262359acf951644b13b33af3aa1f7062613699a (diff)
parent6ebf8824e2eda039168cff05684590e5b3a98bff (diff)
downloadextras-9f9aae3f12c5e5c93820e3a0ffc7f156b92c440f.tar.gz
Snap for 4696032 from 6ebf8824e2eda039168cff05684590e5b3a98bff to pi-release
Change-Id: I96bb4f2904843366bc736d873f78e415494ac36e
Diffstat (limited to 'perfprofd/binder_interface/perfprofd_binder.cc')
-rw-r--r--perfprofd/binder_interface/perfprofd_binder.cc38
1 files changed, 25 insertions, 13 deletions
diff --git a/perfprofd/binder_interface/perfprofd_binder.cc b/perfprofd/binder_interface/perfprofd_binder.cc
index 87e0c5f6..8fc14828 100644
--- a/perfprofd/binder_interface/perfprofd_binder.cc
+++ b/perfprofd/binder_interface/perfprofd_binder.cc
@@ -48,6 +48,7 @@
#include "perfprofd_record.pb.h"
#include "config.h"
+#include "configreader.h"
#include "dropbox.h"
#include "perfprofdcore.h"
#include "perfprofd_io.h"
@@ -115,8 +116,8 @@ class PerfProfdNativeService : public BinderService<PerfProfdNativeService>,
status_t dump(int fd, const Vector<String16> &args) override;
Status startProfiling(int32_t profilingDuration,
- int32_t profilingInterval,
- int32_t iterations) override;
+ int32_t profilingInterval,
+ int32_t iterations) override;
Status startProfilingProtobuf(const std::vector<uint8_t>& config_proto) override;
Status stopProfiling() override;
@@ -331,7 +332,7 @@ Status PerfProfdNativeService::stopProfiling() {
status_t PerfProfdNativeService::shellCommand(int in,
int out,
- int err,
+ int err_fd,
Vector<String16>& args) {
if (android::base::kEnableDChecks) {
LOG(VERBOSE) << "Perfprofd::shellCommand";
@@ -341,23 +342,31 @@ status_t PerfProfdNativeService::shellCommand(int in,
}
}
+ auto err_str = std::fstream(base::StringPrintf("/proc/self/fd/%d", err_fd));
+
if (args.size() >= 1) {
if (args[0] == String16("dump")) {
dump(out, args);
return OK;
} else if (args[0] == String16("startProfiling")) {
- if (args.size() < 4) {
- return BAD_VALUE;
+ ConfigReader reader;
+ for (size_t i = 1; i < args.size(); ++i) {
+ if (!reader.Read(String8(args[i]).string(), /* fail_on_error */ true)) {
+ err_str << base::StringPrintf("Could not parse %s", String8(args[i]).string())
+ << std::endl;
+ return BAD_VALUE;
+ }
}
- // TODO: handle invalid strings.
- int32_t duration = strtol(String8(args[1]).string(), nullptr, 0);
- int32_t interval = strtol(String8(args[2]).string(), nullptr, 0);
- int32_t iterations = strtol(String8(args[3]).string(), nullptr, 0);
- Status status = startProfiling(duration, interval, iterations);
+ auto config_fn = [&](BinderConfig& config) {
+ config = BinderConfig(); // Reset to a default config.
+ reader.FillConfig(&config);
+ };
+ Status status = StartProfiling(config_fn);
if (status.isOk()) {
return OK;
} else {
- return status.serviceSpecificErrorCode();
+ err_str << status.toString8() << std::endl;
+ return UNKNOWN_ERROR;
}
} else if (args[0] == String16("startProfilingProto")) {
if (args.size() < 2) {
@@ -370,20 +379,23 @@ status_t PerfProfdNativeService::shellCommand(int in,
// TODO: Implement reading from disk?
}
if (fd < 0) {
+ err_str << "Bad file descriptor " << args[1] << std::endl;
return BAD_VALUE;
}
binder::Status status = StartProfilingProtobufFd(fd);
if (status.isOk()) {
return OK;
} else {
- return status.serviceSpecificErrorCode();
+ err_str << status.toString8() << std::endl;
+ return UNKNOWN_ERROR;
}
} else if (args[0] == String16("stopProfiling")) {
Status status = stopProfiling();
if (status.isOk()) {
return OK;
} else {
- return status.serviceSpecificErrorCode();
+ err_str << status.toString8() << std::endl;
+ return UNKNOWN_ERROR;
}
}
}