/* * Copyright 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Replayer - Main.cpp * * 1. Get flags from command line * 2. Commit actions or settings based on the flags * 3. Initalize a replayer object with the filename passed in * 4. Replay * 5. Exit successfully or print error statement */ #include <replayer/Replayer.h> #include <csignal> #include <iostream> #include <stdlib.h> #include <unistd.h> using namespace android; void printHelpMenu() { std::cout << "SurfaceReplayer options:\n"; std::cout << "Usage: surfacereplayer [OPTIONS...] <TRACE FILE>\n"; std::cout << " File path must be absolute" << std::endl << std::endl; std::cout << " -m Stops the replayer at the start of the trace and switches "; "to manual replay\n"; std::cout << "\n -t [Number of Threads] Specifies the number of threads to be used while " "replaying (default is " << android::DEFAULT_THREADS << ")\n"; std::cout << "\n -s [Timestamp] Specify at what timestamp should the replayer switch " "to manual replay\n"; std::cout << " -n Ignore timestamps and run through trace as fast as possible\n"; std::cout << " -l Indefinitely loop the replayer\n"; std::cout << " -h Display help menu\n"; std::cout << std::endl; } int main(int argc, char** argv) { std::string filename; bool loop = false; bool wait = true; bool pauseBeginning = false; int numThreads = DEFAULT_THREADS; long stopHere = -1; int opt = 0; while ((opt = getopt(argc, argv, "mt:s:nlh?")) != -1) { switch (opt) { case 'm': pauseBeginning = true; break; case 't': numThreads = atoi(optarg); break; case 's': stopHere = atol(optarg); break; case 'n': wait = false; break; case 'l': loop = true; break; case 'h': case '?': printHelpMenu(); exit(0); default: std::cerr << "Invalid argument...exiting" << std::endl; printHelpMenu(); exit(0); } } char** input = argv + optind; if (input[0] == NULL) { std::cerr << "No trace file provided...exiting" << std::endl; abort(); } filename.assign(input[0]); status_t status = NO_ERROR; do { android::Replayer r(filename, pauseBeginning, numThreads, wait, stopHere); status = r.replay(); } while(loop); if (status == NO_ERROR) { std::cout << "Successfully finished replaying trace" << std::endl; } else { std::cerr << "Trace replayer returned error: " << status << std::endl; } return 0; }