From b639fb458fb2388164adaf45c4e947a2af2ca0e1 Mon Sep 17 00:00:00 2001 From: imarom Date: Tue, 31 May 2016 11:04:11 +0300 Subject: added watchdog --- src/trex_watchdog.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/trex_watchdog.h (limited to 'src/trex_watchdog.h') diff --git a/src/trex_watchdog.h b/src/trex_watchdog.h new file mode 100644 index 00000000..ecc90960 --- /dev/null +++ b/src/trex_watchdog.h @@ -0,0 +1,91 @@ +/* + 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. +*/ + +#ifndef __TREX_WATCHDOG_H__ +#define __TREX_WATCHDOG_H__ + +#include +#include +#include + +#include "os_time.h" + +class WatchDog { +public: + WatchDog() { + m_thread = NULL; + m_active = false; + } + + /** + * add a monitor to the watchdog + * this thread will be monitored and if timeout + * has passed without calling tick - an exception will be called + * + * @author imarom (31-May-16) + * + * @param name + * @param timeout + * + * @return int + */ + int register_monitor(const std::string &name, double timeout_sec); + + /** + * should be called by each thread on it's handle + * + * @author imarom (31-May-16) + * + * @param handle + */ + void tickle(int handle); + + /** + * start the watchdog + * + */ + void start(); + + /** + * stop the watchdog + * + */ + void stop(); + +private: + void _main(); + + struct monitor_st { + int handle; + std::string name; + double timeout_sec; + bool tickled; + dsec_t ts; + }; + + std::vector m_monitors; + + + volatile bool m_active; + std::thread *m_thread; +}; + +#endif /* __TREX_WATCHDOG_H__ */ -- cgit From 3c4a29e15f3663f6413fbee2562d7d0aa4e2f80d Mon Sep 17 00:00:00 2001 From: imarom Date: Wed, 1 Jun 2016 15:52:00 +0300 Subject: watchdog phase 2 --- src/trex_watchdog.h | 70 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 14 deletions(-) (limited to 'src/trex_watchdog.h') diff --git a/src/trex_watchdog.h b/src/trex_watchdog.h index ecc90960..53a48217 100644 --- a/src/trex_watchdog.h +++ b/src/trex_watchdog.h @@ -25,16 +25,40 @@ limitations under the License. #include #include #include +#include +//#include "rte_memory.h" +#include "mbuf.h" #include "os_time.h" -class WatchDog { +class TrexWatchDog { public: - WatchDog() { - m_thread = NULL; - m_active = false; + TrexWatchDog() { + m_thread = NULL; + m_active = false; + m_pending = 0; + + register_signal(); } + /** + * registering a monitor happens from another thread + * this make sure that start will be able to block until + * all threads has registered + * + * @author imarom (01-Jun-16) + */ + void mark_pending_monitor(int count = 1); + + + /** + * blocks while monitors are pending registeration + * + * @author imarom (01-Jun-16) + */ + void block_on_pending(int max_block_time_ms = 200); + + /** * add a monitor to the watchdog * this thread will be monitored and if timeout @@ -49,6 +73,7 @@ public: */ int register_monitor(const std::string &name, double timeout_sec); + /** * should be called by each thread on it's handle * @@ -58,34 +83,51 @@ public: */ void tickle(int handle); + /** * start the watchdog * */ void start(); + /** * stop the watchdog * */ void stop(); -private: - void _main(); + /* should be cache aligned to avoid false sharing */ struct monitor_st { - int handle; - std::string name; - double timeout_sec; - bool tickled; - dsec_t ts; + /* write fields are first */ + volatile bool tickled; + dsec_t ts; + + int handle; + double timeout_sec; + pthread_t tid; + std::string name; + + /* for for a full cacheline */ + uint8_t pad[16]; }; - std::vector m_monitors; +private: + void register_signal(); + void _main(); + + std::vector m_monitors __rte_cache_aligned; + std::mutex m_lock; - volatile bool m_active; - std::thread *m_thread; + volatile bool m_active; + std::thread *m_thread; + volatile int m_pending; + + static bool g_signal_init; }; +static_assert(sizeof(TrexWatchDog::monitor_st) >= RTE_CACHE_LINE_SIZE, "sizeof(monitor_st) != RTE_CACHE_LINE_SIZE" ); + #endif /* __TREX_WATCHDOG_H__ */ -- cgit From 8feef53b5a272ec7a72f05d1a633d2a18071b775 Mon Sep 17 00:00:00 2001 From: imarom Date: Thu, 2 Jun 2016 13:40:02 +0300 Subject: WATCHDOG - disable monitors when done to avoid crash when joining on other threads --- src/trex_watchdog.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/trex_watchdog.h') diff --git a/src/trex_watchdog.h b/src/trex_watchdog.h index 53a48217..63255180 100644 --- a/src/trex_watchdog.h +++ b/src/trex_watchdog.h @@ -74,6 +74,13 @@ public: int register_monitor(const std::string &name, double timeout_sec); + /** + * disable a monitor - it will no longer be watched + * + */ + void disable_monitor(int handle); + + /** * should be called by each thread on it's handle * @@ -101,6 +108,7 @@ public: /* should be cache aligned to avoid false sharing */ struct monitor_st { /* write fields are first */ + volatile bool active; volatile bool tickled; dsec_t ts; @@ -110,7 +118,7 @@ public: std::string name; /* for for a full cacheline */ - uint8_t pad[16]; + uint8_t pad[15]; }; -- cgit