1*77b80299SAndroid Build Coastguard Worker /*
2*77b80299SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*77b80299SAndroid Build Coastguard Worker *
4*77b80299SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*77b80299SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*77b80299SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*77b80299SAndroid Build Coastguard Worker *
8*77b80299SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*77b80299SAndroid Build Coastguard Worker *
10*77b80299SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*77b80299SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*77b80299SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*77b80299SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*77b80299SAndroid Build Coastguard Worker * limitations under the License.
15*77b80299SAndroid Build Coastguard Worker */
16*77b80299SAndroid Build Coastguard Worker
17*77b80299SAndroid Build Coastguard Worker #define LOG_TAG "libhwbinder_benchmark"
18*77b80299SAndroid Build Coastguard Worker
19*77b80299SAndroid Build Coastguard Worker #include <sys/types.h>
20*77b80299SAndroid Build Coastguard Worker #include <sys/wait.h>
21*77b80299SAndroid Build Coastguard Worker #include <unistd.h>
22*77b80299SAndroid Build Coastguard Worker
23*77b80299SAndroid Build Coastguard Worker #include <iostream>
24*77b80299SAndroid Build Coastguard Worker
25*77b80299SAndroid Build Coastguard Worker #include <log/log.h>
26*77b80299SAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
27*77b80299SAndroid Build Coastguard Worker
28*77b80299SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
29*77b80299SAndroid Build Coastguard Worker #include <hidl/Status.h>
30*77b80299SAndroid Build Coastguard Worker #include <hidl/ServiceManagement.h>
31*77b80299SAndroid Build Coastguard Worker
32*77b80299SAndroid Build Coastguard Worker #include <android/hardware/tests/libhwbinder/1.0/IBenchmark.h>
33*77b80299SAndroid Build Coastguard Worker
34*77b80299SAndroid Build Coastguard Worker // libutils:
35*77b80299SAndroid Build Coastguard Worker using android::OK;
36*77b80299SAndroid Build Coastguard Worker using android::sp;
37*77b80299SAndroid Build Coastguard Worker using android::status_t;
38*77b80299SAndroid Build Coastguard Worker
39*77b80299SAndroid Build Coastguard Worker // libhidl:
40*77b80299SAndroid Build Coastguard Worker using android::hardware::defaultServiceManager;
41*77b80299SAndroid Build Coastguard Worker using android::hardware::Return;
42*77b80299SAndroid Build Coastguard Worker using android::hardware::Void;
43*77b80299SAndroid Build Coastguard Worker using android::hardware::hidl_vec;
44*77b80299SAndroid Build Coastguard Worker
45*77b80299SAndroid Build Coastguard Worker // Standard library
46*77b80299SAndroid Build Coastguard Worker using std::cerr;
47*77b80299SAndroid Build Coastguard Worker using std::cout;
48*77b80299SAndroid Build Coastguard Worker using std::endl;
49*77b80299SAndroid Build Coastguard Worker using std::string;
50*77b80299SAndroid Build Coastguard Worker using std::unique_ptr;
51*77b80299SAndroid Build Coastguard Worker using std::vector;
52*77b80299SAndroid Build Coastguard Worker
53*77b80299SAndroid Build Coastguard Worker // Generated HIDL files
54*77b80299SAndroid Build Coastguard Worker using android::hardware::tests::libhwbinder::V1_0::IBenchmark;
55*77b80299SAndroid Build Coastguard Worker
56*77b80299SAndroid Build Coastguard Worker const char gServiceName[] = "android.hardware.tests.libhwbinder.IBenchmark";
57*77b80299SAndroid Build Coastguard Worker
startServer()58*77b80299SAndroid Build Coastguard Worker static bool startServer() {
59*77b80299SAndroid Build Coastguard Worker sp<IBenchmark> service = IBenchmark::getService(gServiceName, true);
60*77b80299SAndroid Build Coastguard Worker status_t status = service->registerAsService(gServiceName);
61*77b80299SAndroid Build Coastguard Worker
62*77b80299SAndroid Build Coastguard Worker if (status != ::android::OK) {
63*77b80299SAndroid Build Coastguard Worker ALOGE("Failed to register service %s.", gServiceName);
64*77b80299SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
65*77b80299SAndroid Build Coastguard Worker }
66*77b80299SAndroid Build Coastguard Worker
67*77b80299SAndroid Build Coastguard Worker return 0;
68*77b80299SAndroid Build Coastguard Worker }
69*77b80299SAndroid Build Coastguard Worker
BM_sendVec(benchmark::State & state,sp<IBenchmark> service)70*77b80299SAndroid Build Coastguard Worker static void BM_sendVec(benchmark::State& state, sp<IBenchmark> service) {
71*77b80299SAndroid Build Coastguard Worker // Prepare data to IPC
72*77b80299SAndroid Build Coastguard Worker hidl_vec<uint8_t> data_vec;
73*77b80299SAndroid Build Coastguard Worker data_vec.resize(state.range(0));
74*77b80299SAndroid Build Coastguard Worker for (int i = 0; i < state.range(0); i++) {
75*77b80299SAndroid Build Coastguard Worker data_vec[i] = i % 256;
76*77b80299SAndroid Build Coastguard Worker }
77*77b80299SAndroid Build Coastguard Worker // Start running
78*77b80299SAndroid Build Coastguard Worker while (state.KeepRunning()) {
79*77b80299SAndroid Build Coastguard Worker service->sendVec(data_vec, [&] (const auto &/*res*/) {
80*77b80299SAndroid Build Coastguard Worker });
81*77b80299SAndroid Build Coastguard Worker }
82*77b80299SAndroid Build Coastguard Worker }
83*77b80299SAndroid Build Coastguard Worker
BM_sendVec_passthrough(benchmark::State & state)84*77b80299SAndroid Build Coastguard Worker static void BM_sendVec_passthrough(benchmark::State& state) {
85*77b80299SAndroid Build Coastguard Worker sp<IBenchmark> service = IBenchmark::getService(gServiceName, true /* getStub */);
86*77b80299SAndroid Build Coastguard Worker if (service == nullptr) {
87*77b80299SAndroid Build Coastguard Worker state.SkipWithError("Failed to retrieve benchmark service.");
88*77b80299SAndroid Build Coastguard Worker }
89*77b80299SAndroid Build Coastguard Worker if (service->isRemote()) {
90*77b80299SAndroid Build Coastguard Worker state.SkipWithError("Benchmark service is remote.");
91*77b80299SAndroid Build Coastguard Worker }
92*77b80299SAndroid Build Coastguard Worker BM_sendVec(state, service);
93*77b80299SAndroid Build Coastguard Worker }
94*77b80299SAndroid Build Coastguard Worker
BM_sendVec_binderize(benchmark::State & state)95*77b80299SAndroid Build Coastguard Worker static void BM_sendVec_binderize(benchmark::State& state) {
96*77b80299SAndroid Build Coastguard Worker android::hardware::details::waitForHwService(IBenchmark::descriptor, gServiceName);
97*77b80299SAndroid Build Coastguard Worker sp<IBenchmark> service = IBenchmark::getService(gServiceName);
98*77b80299SAndroid Build Coastguard Worker if (service == nullptr) {
99*77b80299SAndroid Build Coastguard Worker state.SkipWithError("Failed to retrieve benchmark service.");
100*77b80299SAndroid Build Coastguard Worker }
101*77b80299SAndroid Build Coastguard Worker if (!service->isRemote()) {
102*77b80299SAndroid Build Coastguard Worker state.SkipWithError("Unable to fetch remote benchmark service.");
103*77b80299SAndroid Build Coastguard Worker }
104*77b80299SAndroid Build Coastguard Worker BM_sendVec(state, service);
105*77b80299SAndroid Build Coastguard Worker }
106*77b80299SAndroid Build Coastguard Worker
main(int argc,char * argv[])107*77b80299SAndroid Build Coastguard Worker int main(int argc, char* argv []) {
108*77b80299SAndroid Build Coastguard Worker android::hardware::details::setTrebleTestingOverride(true);
109*77b80299SAndroid Build Coastguard Worker
110*77b80299SAndroid Build Coastguard Worker enum HwBinderMode {
111*77b80299SAndroid Build Coastguard Worker kBinderize = 0,
112*77b80299SAndroid Build Coastguard Worker kPassthrough = 1,
113*77b80299SAndroid Build Coastguard Worker };
114*77b80299SAndroid Build Coastguard Worker HwBinderMode mode = HwBinderMode::kBinderize;
115*77b80299SAndroid Build Coastguard Worker
116*77b80299SAndroid Build Coastguard Worker // Parse arguments.
117*77b80299SAndroid Build Coastguard Worker for (int i = 1; i < argc; i++) {
118*77b80299SAndroid Build Coastguard Worker if (string(argv[i]) == "-m") {
119*77b80299SAndroid Build Coastguard Worker if (!strcmp(argv[i + 1], "PASSTHROUGH")) {
120*77b80299SAndroid Build Coastguard Worker mode = HwBinderMode::kPassthrough;
121*77b80299SAndroid Build Coastguard Worker }
122*77b80299SAndroid Build Coastguard Worker break;
123*77b80299SAndroid Build Coastguard Worker }
124*77b80299SAndroid Build Coastguard Worker }
125*77b80299SAndroid Build Coastguard Worker if (mode == HwBinderMode::kBinderize) {
126*77b80299SAndroid Build Coastguard Worker BENCHMARK(BM_sendVec_binderize)->RangeMultiplier(2)->Range(4, 65536);
127*77b80299SAndroid Build Coastguard Worker } else {
128*77b80299SAndroid Build Coastguard Worker BENCHMARK(BM_sendVec_passthrough)->RangeMultiplier(2)->Range(4, 65536);
129*77b80299SAndroid Build Coastguard Worker }
130*77b80299SAndroid Build Coastguard Worker
131*77b80299SAndroid Build Coastguard Worker ::benchmark::Initialize(&argc, argv);
132*77b80299SAndroid Build Coastguard Worker
133*77b80299SAndroid Build Coastguard Worker pid_t pid = fork();
134*77b80299SAndroid Build Coastguard Worker if (pid == 0) {
135*77b80299SAndroid Build Coastguard Worker // Child, start benchmarks
136*77b80299SAndroid Build Coastguard Worker ::benchmark::RunSpecifiedBenchmarks();
137*77b80299SAndroid Build Coastguard Worker } else {
138*77b80299SAndroid Build Coastguard Worker startServer();
139*77b80299SAndroid Build Coastguard Worker while (true) {
140*77b80299SAndroid Build Coastguard Worker int stat, retval;
141*77b80299SAndroid Build Coastguard Worker retval = wait(&stat);
142*77b80299SAndroid Build Coastguard Worker if (retval == -1 && errno == ECHILD) {
143*77b80299SAndroid Build Coastguard Worker break;
144*77b80299SAndroid Build Coastguard Worker }
145*77b80299SAndroid Build Coastguard Worker }
146*77b80299SAndroid Build Coastguard Worker };
147*77b80299SAndroid Build Coastguard Worker }
148