blob: e19461f6cb4f4a75511239958e1483bb0988c0dc [file] [log] [blame]
Colm Donelana21620d2019-10-11 13:09:49 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Finn Williamse6a2ccd2020-02-27 16:21:41 +00006#include "PacketVersionResolver.hpp"
Colm Donelana21620d2019-10-11 13:09:49 +01007#include "CommandFileParser.hpp"
8#include "CommandLineProcessor.hpp"
Finn Williams15db7452019-10-15 14:22:13 +01009#include "DirectoryCaptureCommandHandler.hpp"
Colm Donelana21620d2019-10-11 13:09:49 +010010#include "GatordMockService.hpp"
Colm Donelana21620d2019-10-11 13:09:49 +010011#include "PeriodicCounterCaptureCommandHandler.hpp"
Colm Donelanb682d842019-10-16 12:24:20 +010012#include "PeriodicCounterSelectionResponseHandler.hpp"
Finn Williamse6a2ccd2020-02-27 16:21:41 +000013#include <TimelineDecoder.hpp>
14#include <TimelineDirectoryCaptureCommandHandler.hpp>
15#include <TimelineCaptureCommandHandler.hpp>
Colm Donelana21620d2019-10-11 13:09:49 +010016
Colm Donelanb682d842019-10-16 12:24:20 +010017#include <iostream>
Colm Donelana21620d2019-10-11 13:09:49 +010018#include <string>
Finn Williamse6a2ccd2020-02-27 16:21:41 +000019#include <NetworkSockets.hpp>
20#include <signal.h>
Colm Donelana21620d2019-10-11 13:09:49 +010021
Finn Williamse6a2ccd2020-02-27 16:21:41 +000022using namespace armnn;
23using namespace gatordmock;
24
25// Used to capture ctrl-c so we can close any remaining sockets before exit
26static volatile bool run = true;
27void exit_capture(int signum)
Colm Donelana21620d2019-10-11 13:09:49 +010028{
Finn Williamse6a2ccd2020-02-27 16:21:41 +000029 IgnoreUnused(signum);
30 run = false;
31}
Colm Donelana21620d2019-10-11 13:09:49 +010032
Finn Williamse6a2ccd2020-02-27 16:21:41 +000033bool CreateMockService(armnnUtils::Sockets::Socket clientConnection, std::string commandFile, bool isEchoEnabled)
34{
35 profiling::PacketVersionResolver packetVersionResolver;
Colm Donelana21620d2019-10-11 13:09:49 +010036 // Create the Command Handler Registry
Finn Williamse6a2ccd2020-02-27 16:21:41 +000037 profiling::CommandHandlerRegistry registry;
38
39 timelinedecoder::TimelineDecoder timelineDecoder;
40 timelineDecoder.SetDefaultCallbacks();
Colm Donelana21620d2019-10-11 13:09:49 +010041
Colm Donelanb682d842019-10-16 12:24:20 +010042 // This functor will receive back the selection response packet.
Finn Williamse6a2ccd2020-02-27 16:21:41 +000043 PeriodicCounterSelectionResponseHandler periodicCounterSelectionResponseHandler(
44 0, 4, packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue());
Colm Donelanb682d842019-10-16 12:24:20 +010045 // This functor will receive the counter data.
Finn Williamse6a2ccd2020-02-27 16:21:41 +000046 PeriodicCounterCaptureCommandHandler counterCaptureCommandHandler(
47 3, 0, packetVersionResolver.ResolvePacketVersion(3, 0).GetEncodedValue());
Colm Donelana21620d2019-10-11 13:09:49 +010048
Finn Williamse6a2ccd2020-02-27 16:21:41 +000049 profiling::DirectoryCaptureCommandHandler directoryCaptureCommandHandler(
50 0, 2, packetVersionResolver.ResolvePacketVersion(0, 2).GetEncodedValue(), false);
51
52 timelinedecoder::TimelineCaptureCommandHandler timelineCaptureCommandHandler(
53 1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder);
54
55 timelinedecoder::TimelineDirectoryCaptureCommandHandler timelineDirectoryCaptureCommandHandler(
56 1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(),
57 timelineCaptureCommandHandler, false);
Finn Williams15db7452019-10-15 14:22:13 +010058
Colm Donelana21620d2019-10-11 13:09:49 +010059 // Register different derived functors
Colm Donelanb682d842019-10-16 12:24:20 +010060 registry.RegisterFunctor(&periodicCounterSelectionResponseHandler);
Colm Donelana21620d2019-10-11 13:09:49 +010061 registry.RegisterFunctor(&counterCaptureCommandHandler);
Finn Williams15db7452019-10-15 14:22:13 +010062 registry.RegisterFunctor(&directoryCaptureCommandHandler);
Finn Williamse6a2ccd2020-02-27 16:21:41 +000063 registry.RegisterFunctor(&timelineDirectoryCaptureCommandHandler);
64 registry.RegisterFunctor(&timelineCaptureCommandHandler);
Colm Donelana21620d2019-10-11 13:09:49 +010065
Finn Williamse6a2ccd2020-02-27 16:21:41 +000066 GatordMockService mockService(clientConnection, registry, isEchoEnabled);
Colm Donelana21620d2019-10-11 13:09:49 +010067
68 // Send receive the strweam metadata and send connection ack.
69 if (!mockService.WaitForStreamMetaData())
70 {
71 return EXIT_FAILURE;
72 }
73 mockService.SendConnectionAck();
74
75 // Prepare to receive data.
76 mockService.LaunchReceivingThread();
77
78 // Process the SET and WAIT command from the file.
Finn Williamse6a2ccd2020-02-27 16:21:41 +000079 CommandFileParser commandLineParser;
80 commandLineParser.ParseFile(commandFile, mockService);
Colm Donelana21620d2019-10-11 13:09:49 +010081
82 // Once we've finished processing the file wait for the receiving thread to close.
83 mockService.WaitForReceivingThread();
84
Finn Williamse6a2ccd2020-02-27 16:21:41 +000085 if(isEchoEnabled)
86 {
87 timelineDecoder.print();
88 }
89
Colm Donelana21620d2019-10-11 13:09:49 +010090 return EXIT_SUCCESS;
91}
Finn Williamse6a2ccd2020-02-27 16:21:41 +000092
93int main(int argc, char* argv[])
94{
95 // We need to capture ctrl-c so we can close any remaining sockets before exit
96 signal(SIGINT, exit_capture);
97
98 // Process command line arguments
99 CommandLineProcessor cmdLine;
100 if (!cmdLine.ProcessCommandLine(argc, argv))
101 {
102 return EXIT_FAILURE;
103 }
104
105 std::vector<std::thread> threads;
106 std::string commandFile = cmdLine.GetCommandFile();
107
108 armnnUtils::Sockets::Initialize();
109 armnnUtils::Sockets::Socket listeningSocket = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
110
111 if (!GatordMockService::OpenListeningSocket(listeningSocket, cmdLine.GetUdsNamespace(), 10))
112 {
113 return EXIT_FAILURE;
114 }
115 std::cout << "Bound to UDS namespace: \\0" << cmdLine.GetUdsNamespace() << std::endl;
116
117 // make the socket non-blocking so we can exit the loop
118 armnnUtils::Sockets::SetNonBlocking(listeningSocket);
119 while (run)
120 {
121 armnnUtils::Sockets::Socket clientConnection =
122 armnnUtils::Sockets::Accept(listeningSocket, nullptr, nullptr, SOCK_CLOEXEC);
123
124 if (clientConnection > 0)
125 {
126 threads.emplace_back(
127 std::thread(CreateMockService, clientConnection, commandFile, cmdLine.IsEchoEnabled()));
128 }
129
130 std::this_thread::sleep_for(std::chrono::milliseconds(100u));
131 }
132
133 armnnUtils::Sockets::Close(listeningSocket);
134 std::for_each(threads.begin(), threads.end(), [](std::thread& t){t.join();});
135}