1c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju/* 2c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Copyright 2016 The Android Open Source Project 3c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 4c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Licensed under the Apache License, Version 2.0 (the "License"); 5c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * you may not use this file except in compliance with the License. 6c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * You may obtain a copy of the License at 7c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 8c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * http://www.apache.org/licenses/LICENSE-2.0 9c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 10c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Unless required by applicable law or agreed to in writing, software 11c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * distributed under the License is distributed on an "AS IS" BASIS, 12c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * See the License for the specific language governing permissions and 14c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * limitations under the License. 15c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju */ 16c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 17c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju/* 18c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Replayer - Main.cpp 19c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 20c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 1. Get flags from command line 21c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 2. Commit actions or settings based on the flags 22c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 3. Initalize a replayer object with the filename passed in 23c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 4. Replay 24c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 5. Exit successfully or print error statement 25c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju */ 26c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 27c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <replayer/Replayer.h> 28c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 29c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <csignal> 30c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <iostream> 31c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <stdlib.h> 32c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <unistd.h> 33c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 34c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuusing namespace android; 35c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 36c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuvoid printHelpMenu() { 37c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "SurfaceReplayer options:\n"; 38c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "Usage: surfacereplayer [OPTIONS...] <TRACE FILE>\n"; 39c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << " File path must be absolute" << std::endl << std::endl; 40c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 41c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << " -m Stops the replayer at the start of the trace and switches "; 42c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju "to manual replay\n"; 43c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 4401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "\n -t [Number of Threads] Specifies the number of threads to be used while " 45c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju "replaying (default is " << android::DEFAULT_THREADS << ")\n"; 46c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 4701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << "\n -s [Timestamp] Specify at what timestamp should the replayer switch " 4801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju "to manual replay\n"; 4901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 5001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " -n Ignore timestamps and run through trace as fast as possible\n"; 5101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 5201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju std::cout << " -l Indefinitely loop the replayer\n"; 5301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju 54c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << " -h Display help menu\n"; 55c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 56c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << std::endl; 57c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 58c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 59c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuint main(int argc, char** argv) { 60c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::string filename; 6101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju bool loop = false; 6201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju bool wait = true; 63c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bool pauseBeginning = false; 64c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int numThreads = DEFAULT_THREADS; 6501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju long stopHere = -1; 66c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 67c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int opt = 0; 6801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju while ((opt = getopt(argc, argv, "mt:s:nlh?")) != -1) { 69c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju switch (opt) { 70c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case 'm': 71c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju pauseBeginning = true; 72c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 73c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case 't': 74c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju numThreads = atoi(optarg); 75c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju break; 7601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case 's': 7701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju stopHere = atol(optarg); 7801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 7901041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case 'n': 8001041fe22aead67520962b534134b3e3291b1622Sahil Dhanju wait = false; 8101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 8201041fe22aead67520962b534134b3e3291b1622Sahil Dhanju case 'l': 8301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju loop = true; 8401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju break; 85c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case 'h': 86c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju case '?': 87c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju printHelpMenu(); 88c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju exit(0); 89c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju default: 90c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cerr << "Invalid argument...exiting" << std::endl; 91c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju printHelpMenu(); 92c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju exit(0); 93c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 94c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 95c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 96c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju char** input = argv + optind; 97c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (input[0] == NULL) { 98c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cerr << "No trace file provided...exiting" << std::endl; 99c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju abort(); 100c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 101c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju filename.assign(input[0]); 102c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 10301041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status_t status = NO_ERROR; 10401041fe22aead67520962b534134b3e3291b1622Sahil Dhanju do { 10501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju android::Replayer r(filename, pauseBeginning, numThreads, wait, stopHere); 10601041fe22aead67520962b534134b3e3291b1622Sahil Dhanju status = r.replay(); 10701041fe22aead67520962b534134b3e3291b1622Sahil Dhanju } while(loop); 108c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 109c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju if (status == NO_ERROR) { 110c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cout << "Successfully finished replaying trace" << std::endl; 111c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } else { 112c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::cerr << "Trace replayer returned error: " << status << std::endl; 113c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju } 114c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 115c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju return 0; 116c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} 117