1c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor/*
2c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * Copyright (C) 2010 The Android Open Source Project
3c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor *
4c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * Licensed under the Apache License, Version 2.0 (the "License");
5c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * you may not use this file except in compliance with the License.
6c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * You may obtain a copy of the License at
7c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor *
8c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor *      http://www.apache.org/licenses/LICENSE-2.0
9c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor *
10c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * Unless required by applicable law or agreed to in writing, software
11c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * distributed under the License is distributed on an "AS IS" BASIS,
12c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * See the License for the specific language governing permissions and
14c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor * limitations under the License.
15c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor */
16c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
1738aec01049a21b756af9c003caa4c67d0357093aDan Egnor#include <binder/IInterface.h>
18c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor#include <binder/IServiceManager.h>
1938aec01049a21b756af9c003caa4c67d0357093aDan Egnor#include <binder/IPCThreadState.h>
2038aec01049a21b756af9c003caa4c67d0357093aDan Egnor#include <utils/Log.h>
21c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
22c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor#include <stdio.h>
23c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor#include <time.h>
2438aec01049a21b756af9c003caa4c67d0357093aDan Egnor#include <unistd.h>
25c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
26c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnorusing namespace android;
27c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
2838aec01049a21b756af9c003caa4c67d0357093aDan Egnorstatic const int WARMUP = 100;
29c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnorstatic const int COUNT = 10000;
30c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
3138aec01049a21b756af9c003caa4c67d0357093aDan Egnorclass ITestService : public IInterface {
3238aec01049a21b756af9c003caa4c67d0357093aDan Egnorpublic:
3338aec01049a21b756af9c003caa4c67d0357093aDan Egnor    DECLARE_META_INTERFACE(TestService);
3438aec01049a21b756af9c003caa4c67d0357093aDan Egnor};
3538aec01049a21b756af9c003caa4c67d0357093aDan Egnor
3638aec01049a21b756af9c003caa4c67d0357093aDan Egnortypedef BpInterface<ITestService> BpTestService;
3738aec01049a21b756af9c003caa4c67d0357093aDan Egnor
3838aec01049a21b756af9c003caa4c67d0357093aDan EgnorIMPLEMENT_META_INTERFACE(TestService, "TestService");
3938aec01049a21b756af9c003caa4c67d0357093aDan Egnor
4038aec01049a21b756af9c003caa4c67d0357093aDan Egnorint main(int argc, const char *argv[]) {
4138aec01049a21b756af9c003caa4c67d0357093aDan Egnor    if (argc != 2 || argv[1][0] == '-') {
4238aec01049a21b756af9c003caa4c67d0357093aDan Egnor        fprintf(stderr, "usage: rpcperftest service-to-test | :service-to-serve\n");
43c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        return 2;
44c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    }
45c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
46c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    sp<IServiceManager> sm = defaultServiceManager();
47c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    if (sm == NULL) {
48c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        fprintf(stderr, "error: can't get default service manager\n");
49c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        return 1;
50c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    }
51c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
5238aec01049a21b756af9c003caa4c67d0357093aDan Egnor    if (argv[1][0] == ':') {
5338aec01049a21b756af9c003caa4c67d0357093aDan Egnor        String16 name(argv[1] + 1);
5438aec01049a21b756af9c003caa4c67d0357093aDan Egnor        status_t status = sm->addService(name, new BnInterface<ITestService>());
5538aec01049a21b756af9c003caa4c67d0357093aDan Egnor        if (status != OK) {
5638aec01049a21b756af9c003caa4c67d0357093aDan Egnor            fprintf(stderr, "error: can't register service: %s\n", argv[1] + 1);
5738aec01049a21b756af9c003caa4c67d0357093aDan Egnor            return 1;
5838aec01049a21b756af9c003caa4c67d0357093aDan Egnor        }
5938aec01049a21b756af9c003caa4c67d0357093aDan Egnor
6038aec01049a21b756af9c003caa4c67d0357093aDan Egnor        ProcessState::self()->startThreadPool();
6138aec01049a21b756af9c003caa4c67d0357093aDan Egnor        IPCThreadState::self()->joinThreadPool();
6238aec01049a21b756af9c003caa4c67d0357093aDan Egnor        fprintf(stderr, "error: can't run service\n");
6338aec01049a21b756af9c003caa4c67d0357093aDan Egnor        return 1;
6438aec01049a21b756af9c003caa4c67d0357093aDan Egnor    }
6538aec01049a21b756af9c003caa4c67d0357093aDan Egnor
66c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    sp<IBinder> service = sm->checkService(String16(argv[1]));
67c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    if (service == NULL) {
68c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        fprintf(stderr, "error: can't find service: %s\n", argv[1]);
69c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        return 1;
70c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    }
71c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
7238aec01049a21b756af9c003caa4c67d0357093aDan Egnor    for (int i = 0; i < WARMUP; i++) {
7338aec01049a21b756af9c003caa4c67d0357093aDan Egnor        status_t status = service->pingBinder();
7438aec01049a21b756af9c003caa4c67d0357093aDan Egnor        if (status != OK) {
7538aec01049a21b756af9c003caa4c67d0357093aDan Egnor            fprintf(stderr, "error: can't ping: %s [%d]\n", argv[1], status);
7638aec01049a21b756af9c003caa4c67d0357093aDan Egnor            return 1;
7738aec01049a21b756af9c003caa4c67d0357093aDan Egnor        }
7838aec01049a21b756af9c003caa4c67d0357093aDan Egnor    }
7938aec01049a21b756af9c003caa4c67d0357093aDan Egnor
80c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    struct timespec before, after;
81c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    clock_gettime(CLOCK_MONOTONIC, &before);
82c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    for (int i = 0; i < COUNT; i++) {
83c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        status_t status = service->pingBinder();
84c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        if (status != OK) {
8538aec01049a21b756af9c003caa4c67d0357093aDan Egnor            fprintf(stderr, "error: can't ping: %s [%d]\n", argv[1], status);
86c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor            return 1;
87c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        }
88c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    }
89c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    clock_gettime(CLOCK_MONOTONIC, &after);
90c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
91c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    double seconds = (after.tv_sec - before.tv_sec);
92c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    seconds += (after.tv_nsec - before.tv_nsec) / 1000000000.0;
93c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    printf("%d calls in %.3f sec => %.3f ms/call\n",
94c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor        COUNT, seconds, 1000.0 * seconds / COUNT);
95c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor
96c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor    return 0;
97c96df1e4e51da4f0dbd4dd4824b9b3ca835b6124Dan Egnor}
98