xref: /aosp_15_r20/external/deqp/execserver/tools/xsMain.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program Execution Server
3  * ---------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief ExecServer main().
22  *//*--------------------------------------------------------------------*/
23 
24 #include "xsExecutionServer.hpp"
25 #include "deCommandLine.hpp"
26 #include "deString.h"
27 
28 #if (DE_OS == DE_OS_WIN32)
29 #include "xsWin32TestProcess.hpp"
30 #else
31 #include "xsPosixTestProcess.hpp"
32 #endif
33 
34 #include <iostream>
35 
36 namespace opt
37 {
38 
39 DE_DECLARE_COMMAND_LINE_OPT(Port, int);
40 DE_DECLARE_COMMAND_LINE_OPT(SingleExec, bool);
41 
registerOptions(de::cmdline::Parser & parser)42 void registerOptions(de::cmdline::Parser &parser)
43 {
44     using de::cmdline::NamedValue;
45     using de::cmdline::Option;
46 
47     parser << Option<Port>("p", "port", "Port", "50016")
48            << Option<SingleExec>("s", "single", "Kill execserver after first session");
49 }
50 
51 } // namespace opt
52 
main(int argc,const char * const * argv)53 int main(int argc, const char *const *argv)
54 {
55     de::cmdline::CommandLine cmdLine;
56 
57 #if (DE_OS == DE_OS_WIN32)
58     xs::Win32TestProcess testProcess;
59 #else
60     xs::PosixTestProcess testProcess;
61 
62     // Set line buffered mode to stdout so executor gets any log messages in a timely manner.
63     setvbuf(stdout, DE_NULL, _IOLBF, 4 * 1024);
64 #endif
65 
66     // Parse command line.
67     {
68         de::cmdline::Parser parser;
69         opt::registerOptions(parser);
70 
71         if (!parser.parse(argc, argv, &cmdLine, std::cerr))
72         {
73             parser.help(std::cout);
74             return -1;
75         }
76     }
77 
78     try
79     {
80         const xs::ExecutionServer::RunMode runMode = cmdLine.getOption<opt::SingleExec>() ?
81                                                          xs::ExecutionServer::RUNMODE_SINGLE_EXEC :
82                                                          xs::ExecutionServer::RUNMODE_FOREVER;
83         const int port                             = cmdLine.getOption<opt::Port>();
84         xs::ExecutionServer server(&testProcess, DE_SOCKETFAMILY_INET4, port, runMode);
85 
86         std::cout << "Listening on port " << port << ".\n";
87         server.runServer();
88     }
89     catch (const std::exception &e)
90     {
91         std::cerr << e.what() << "\n";
92         return -1;
93     }
94 
95     return 0;
96 }
97