6 #ifndef __DDS__MonitoringThread__ 7 #define __DDS__MonitoringThread__ 24 typedef std::function<bool()> callbackFunction_t;
26 typedef std::pair<callbackFunction_t, std::chrono::seconds> callbackValue_t;
48 void start(
double _idleTime,
const std::function<
void(
void)>& _idleCallback)
51 static const std::chrono::seconds INTERVAL_STEP(1);
52 static const std::chrono::seconds WAITING_TIME(20);
56 std::thread t([
this, &_idleCallback, _idleTime]() {
59 std::chrono::seconds secInterval(0);
66 std::lock_guard<std::mutex> lock(m_registeredCallbackFunctionsMutex);
69 m_registeredCallbackFunctions.erase(
70 remove_if(m_registeredCallbackFunctions.begin(),
71 m_registeredCallbackFunctions.end(),
72 [&](callbackValue_t& i) {
77 const int nCurInterval = std::chrono::duration<int>(secInterval).count();
78 const int nInterval = std::chrono::duration<int>(i.second).count();
79 if (nCurInterval != 0 && nCurInterval >= nInterval &&
80 0 == (nCurInterval % nInterval))
83 <<
"MONITORING: calling callback at interval of " 84 << std::chrono::duration<int>(i.second).count();
89 m_registeredCallbackFunctions.end());
91 catch (std::exception& _e)
100 std::chrono::seconds idleTime;
103 std::lock_guard<std::mutex> lock(m_mutex);
104 std::chrono::steady_clock::time_point currentTime = std::chrono::steady_clock::now();
105 idleTime = std::chrono::duration_cast<std::chrono::seconds>(currentTime - m_startIdleTime);
108 if (idleTime.count() > _idleTime)
112 <<
" sec. Call idle callback and wait " 113 << std::chrono::duration<int>(WAITING_TIME).count() <<
"s";
120 catch (std::exception& _e)
123 <<
"MonitoringThread exception on custom idle function: " << _e.what();
129 std::this_thread::sleep_for(WAITING_TIME);
134 std::this_thread::sleep_for(WAITING_TIME);
141 std::this_thread::sleep_for(INTERVAL_STEP);
142 secInterval += INTERVAL_STEP;
145 catch (std::exception& _e)
155 std::lock_guard<std::mutex> lock(m_mutex);
156 m_startIdleTime = std::chrono::steady_clock::now();
161 std::lock_guard<std::mutex> lock(m_registeredCallbackFunctionsMutex);
162 m_registeredCallbackFunctions.push_back(make_pair(_handler, _interval));
168 pid_t pidToKill(::getpid());
174 kill(pidToKill, SIGTERM);
178 const size_t max_iter = 30;
179 while (iter <= max_iter)
196 std::chrono::steady_clock::time_point m_startIdleTime;
198 std::function<void(
void)> m_idleCallback;
199 std::vector<callbackValue_t> m_registeredCallbackFunctions;
201 std::mutex m_registeredCallbackFunctionsMutex;
void start(double _idleTime, const std::function< void(void)> &_idleCallback)
Main function user has to run to start monitoring thread.
Definition: MonitoringThread.h:48
static CMonitoringThread & instance()
Return singleton instance.
Definition: MonitoringThread.h:38
Definition: MonitoringThread.h:22
#define LOG(severity)
Definition: Logger.h:56
Definition: AgentConnectionManager.h:13
void registerCallbackFunction(callbackFunction_t _handler, const std::chrono::seconds &_interval)
Definition: MonitoringThread.h:159
void updateIdle()
Definition: MonitoringThread.h:153
bool IsProcessRunning(pid_t _PID)
The function checks, whether the process which corresponds to the given _PID can be found.
Definition: Process.h:57