• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
printHelpMenu()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 
main(int argc,char ** argv)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