YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
executable.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
8
9using namespace yarp::manager;
10
11Executable::Executable(Broker* _broker, MEvent* _event, Module *module,
12 bool _bWatchDog)
13{
14 bAutoConnect = true;
15 broker = _broker;
16 event = _event;
17 bWatchDog = _bWatchDog;
18 waitStart = 0.0;
19 waitStop = 0.0;
20 originalWaitStart = 0.0;
21 originalWaitStop = 0.0;
22 Executable::module = module;
23 logger = ErrorLogger::Instance();
24 broker->setEventSink(dynamic_cast<BrokerEventSink*>(this));
25 execMachine = new ExecMachine(this);
26 startWrapper = new ConcurentWrapper(this, &Executable::startImplement);
27 stopWrapper = new ConcurentWrapper(this, &Executable::stopImplement);
28 killWrapper = new ConcurentWrapper(this, &Executable::killImplement);
29 theID = -1;
30
31 if (bWatchDog) {
32 watchdogWrapper = new ConcurentRateWrapper(this, &Executable::watchdogImplement);
33 } else {
34 watchdogWrapper = nullptr;
35 }
36}
37
39{
40 if (watchdogWrapper) {
41 delete watchdogWrapper;
42 }
43 delete startWrapper;
44 delete stopWrapper;
45 delete killWrapper;
46 delete execMachine;
48}
49
50
51bool Executable::initialize()
52{
53 __CHECK_NULLPTR(broker);
54 __CHECK_NULLPTR(event);
55
56 semInitialize.wait();
57 bool ret = broker->init(strCommand.c_str(),
58 strParam.c_str(),
59 strHost.c_str(),
60 strStdio.c_str(),
61 strWorkdir.c_str(),
62 strEnv.c_str());
63 semInitialize.post();
64 if(!ret)
65 {
66 OSTRINGSTREAM msg;
67 msg<<"cannot initialize broker. : ";
68 if (!broker->error().empty()) {
69 msg << broker->error();
70 }
71 logger->addError(msg);
72 event->onExecutableDied(this);
73 return false;
74 }
75 return true;
76}
77
78
80{
81 if(!initialize()) {
82 event->onExecutableDied(this);
83 return false;
84 }
85
86 if(!startWrapper->isRunning()) {
87 startWrapper->start();
88 return true;
89 }
90 return false;
91}
92
93
94void Executable::startImplement()
95{
96 execMachine->start();
97 execMachine->startModule();
98 execMachine->connectAllPorts();
99}
100
101
103{
104 if (!broker->initialized()) {
105 initialize();
106 }
107
108 if(!stopWrapper->isRunning()) {
109 stopWatchDog();
110 stopWrapper->start();
111 }
112}
113
114void Executable::stopImplement()
115{
116 execMachine->stop();
117 execMachine->disconnectAllPorts();
118 execMachine->refresh();
119 execMachine->stopModule();
120}
121
122
124{
125 if (!broker->initialized()) {
126 initialize();
127 }
128
129 // Notice that kill can be called from multiple threads
130 stopWatchDog();
131 killWrapper->start();
132}
133
134void Executable::killImplement()
135{
136 execMachine->kill();
137 execMachine->killModule();
138}
139
140
142{
143
144 if (!broker->initialized()) {
145 initialize();
146 }
147
148 // Updating real module state on demand
149 // Notice that this is a blocking method
150 execMachine->refresh();
151
152 const char* strState = execMachine->currentState()->getName();
153
154 if (compareString(strState, "SUSPENDED")) {
155 return SUSPENDED;
156 }
157 if (compareString(strState, "READY")) {
158 return READY;
159 }
160 if (compareString(strState, "CONNECTING")) {
161 return CONNECTING;
162 }
163 if (compareString(strState, "RUNNING")) {
164 return RUNNING;
165 }
166 if (compareString(strState, "DEAD")) {
167 return DEAD;
168 }
169 if (compareString(strState, "DYING")) {
170 return DYING;
171 }
172
173 std::cerr<<"Unknown state!"<<std::endl;
174 return STUNKNOWN;
175}
176
178{
179 if (broker == nullptr)
180 {
181 return BrokerType::invalid;
182 }
183 else if (dynamic_cast<YarpBroker*>(broker))
184 {
185 return BrokerType::yarp;
186 }
187 else
188 {
189 return BrokerType::local;
190 }
191
192}
193
195{
197 strHost != "localhost")
198 {
199 return true;
200 }
201 else if (getBrokerType() == BrokerType::yarp &&
202 strHost == "localhost")
203 {
204 return true;
205 }
206 return false;
207
208}
209
211{
212 if (_broker)
213 {
214 broker = _broker;
215 initialize();
216 }
217}
218
220 if (watchdogWrapper == nullptr) {
221 return false;
222 }
223 if (!watchdogWrapper->isRunning()) {
224 watchdogWrapper->start();
225 }
226 return true;
227}
228
230 if (watchdogWrapper && watchdogWrapper->isRunning()) {
231 watchdogWrapper->stop();
232 }
233}
234
235void Executable::onBrokerStdout(const char* msg)
236{
237 event->onExecutableStdout(this, msg);
238}
239
240
241void Executable::watchdogImplement()
242{
243 if (!broker->running()) {
244 execMachine->moduleFailed();
245 }
246
247 if(bAutoConnect)
248 {
249 CnnIterator itr;
250 for (itr = connections.begin(); itr != connections.end(); itr++) {
251 if (!broker->connected((*itr).from(), (*itr).to(), (*itr).carrier())) {
252 execMachine->connectionFailed(&(*itr));
253 }
254 }
255 }
256}
bool ret
const char * getName()
Definition fsm.h:86
StateBase * currentState()
Definition fsm.h:115
Class Broker.
Definition broker.h:30
virtual int running()=0
virtual bool init()=0
virtual bool initialized()=0
virtual bool connected(const std::string &from, const std::string &to, const std::string &carrier)=0
void setEventSink(BrokerEventSink *pEventSink)
Definition broker.cpp:21
virtual std::string error()=0
void addError(const char *szError)
Definition utility.cpp:126
static ErrorLogger * Instance()
Singleton class ErrorLogger.
Definition utility.cpp:98
Class ExecMachine.
Definition execstate.h:196
void connectionFailed(void *which)
void onBrokerStdout(const char *msg) override
Executable(Broker *_broker, MEvent *_event, Module *module, bool bWatchDog=true)
void setAndInitializeBroker(Broker *_broker)
Class Module.
Definition module.h:99
bool isRunning() const
Returns true when the thread is started, false otherwise.
bool start()
Call this to start the thread.
void stop()
Call this to stop the thread, this call blocks until the thread is terminated (and releaseThread() ca...
void wait()
Decrement the counter, even if we must wait to do that.
Definition Semaphore.cpp:96
void post()
Increment the counter.
bool isRunning()
Returns true if the thread is running (Thread::start has been called successfully and the thread has ...
Definition Thread.cpp:105
bool start()
Start the new thread running.
Definition Thread.cpp:93
bool compareString(const char *szFirst, const char *szSecond)
Definition utility.cpp:326
enum yarp::manager::__RSTATE RSTATE
std::vector< Connection >::iterator CnnIterator
std::stringstream OSTRINGSTREAM
Definition utility.h:50
#define __CHECK_NULLPTR(_ptr)
Definition ymm-types.h:77