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