diff options
author | imarom <imarom@cisco.com> | 2016-05-31 11:04:11 +0300 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2016-06-02 13:45:12 +0300 |
commit | b639fb458fb2388164adaf45c4e947a2af2ca0e1 (patch) | |
tree | fcfad63222e8b052e8500c8a0cdd15513541afab /src/trex_watchdog.cpp | |
parent | 7bbba823029e4b6dd00ec5c336832e928cd3685d (diff) |
added watchdog
Diffstat (limited to 'src/trex_watchdog.cpp')
-rw-r--r-- | src/trex_watchdog.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/trex_watchdog.cpp b/src/trex_watchdog.cpp new file mode 100644 index 00000000..b3a0733c --- /dev/null +++ b/src/trex_watchdog.cpp @@ -0,0 +1,97 @@ +/* + Itay Marom + Cisco Systems, Inc. +*/ + +/* +Copyright (c) 2015-2015 Cisco Systems, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "trex_watchdog.h" +#include "trex_exception.h" + +#include <assert.h> +#include <unistd.h> +#include <sstream> + +int WatchDog::register_monitor(const std::string &name, double timeout_sec) { + monitor_st monitor; + + monitor.name = name; + monitor.timeout_sec = timeout_sec; + monitor.tickled = true; + monitor.ts = 0; + + monitor.handle = m_monitors.size(); + m_monitors.push_back(monitor); + + return monitor.handle; +} + +void WatchDog::tickle(int handle) { + assert(handle < m_monitors.size()); + + /* not nesscary but write gets cache invalidate for nothing */ + if (m_monitors[handle].tickled) { + return; + } + + m_monitors[handle].tickled = true; +} + +void WatchDog::start() { + m_active = true; + m_thread = new std::thread(&WatchDog::_main, this); + if (!m_thread) { + throw TrexException("unable to create watchdog thread"); + } +} + +void WatchDog::stop() { + m_thread->join(); + delete m_thread; +} + +/** + * main loop + * + */ +void WatchDog::_main() { + while (m_active) { + + dsec_t now = now_sec(); + + for (auto &monitor : m_monitors) { + /* if its own - turn it off and write down the time */ + if (monitor.tickled) { + monitor.tickled = false; + monitor.ts = now; + continue; + } + + /* the bit is off - check the time first */ + if ( (now - monitor.ts) > monitor.timeout_sec ) { + std::stringstream ss; + ss << "WATCHDOG: task '" << monitor.name << "' has not responded for more than " << (now - monitor.ts) << " seconds - timeout is " << monitor.timeout_sec << " seconds"; + throw TrexException(ss.str()); + assert(0); + } + + } + + sleep(1); + } +} + |