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