| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 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/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 |  | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 44 | std::cout << "\n  -t [Number of Threads]  Specifies the number of threads to be used while " | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 45 | "replaying (default is " << android::DEFAULT_THREADS << ")\n"; | 
|  | 46 |  | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 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 |  | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 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; | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 61 | bool loop = false; | 
|  | 62 | bool wait = true; | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 63 | bool pauseBeginning = false; | 
|  | 64 | int numThreads = DEFAULT_THREADS; | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 65 | long stopHere = -1; | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 66 |  | 
|  | 67 | int opt = 0; | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 68 | while ((opt = getopt(argc, argv, "mt:s:nlh?")) != -1) { | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 69 | switch (opt) { | 
|  | 70 | case 'm': | 
|  | 71 | pauseBeginning = true; | 
|  | 72 | break; | 
|  | 73 | case 't': | 
|  | 74 | numThreads = atoi(optarg); | 
|  | 75 | break; | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 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; | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 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] == NULL) { | 
|  | 98 | std::cerr << "No trace file provided...exiting" << std::endl; | 
|  | 99 | abort(); | 
|  | 100 | } | 
|  | 101 | filename.assign(input[0]); | 
|  | 102 |  | 
| Sahil Dhanju | 01041fe | 2016-08-08 20:27:23 -0700 | [diff] [blame] | 103 | status_t status = NO_ERROR; | 
|  | 104 | do { | 
|  | 105 | android::Replayer r(filename, pauseBeginning, numThreads, wait, stopHere); | 
|  | 106 | status = r.replay(); | 
|  | 107 | } while(loop); | 
| Sahil Dhanju | c1ba5c4 | 2016-06-07 20:09:20 -0700 | [diff] [blame] | 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 | } |