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