diff options
author | imarom <imarom@cisco.com> | 2016-06-01 15:52:00 +0300 |
---|---|---|
committer | imarom <imarom@cisco.com> | 2016-06-02 13:45:12 +0300 |
commit | 3c4a29e15f3663f6413fbee2562d7d0aa4e2f80d (patch) | |
tree | c9742549ad7a8013f43077dceb5fa9eacf0aaadf /src/trex_watchdog.h | |
parent | b639fb458fb2388164adaf45c4e947a2af2ca0e1 (diff) |
watchdog phase 2
Diffstat (limited to 'src/trex_watchdog.h')
-rw-r--r-- | src/trex_watchdog.h | 70 |
1 files changed, 56 insertions, 14 deletions
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,17 +25,41 @@ limitations under the License. #include <string> #include <vector> #include <thread> +#include <mutex> +//#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 * has passed without calling tick - an exception will be called @@ -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<monitor_st> m_monitors; +private: + void register_signal(); + void _main(); + + std::vector<monitor_st> 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__ */ |