summaryrefslogtreecommitdiffstats
path: root/src/trex_watchdog.h
diff options
context:
space:
mode:
authorimarom <imarom@cisco.com>2016-06-01 15:52:00 +0300
committerimarom <imarom@cisco.com>2016-06-02 13:45:12 +0300
commit3c4a29e15f3663f6413fbee2562d7d0aa4e2f80d (patch)
treec9742549ad7a8013f43077dceb5fa9eacf0aaadf /src/trex_watchdog.h
parentb639fb458fb2388164adaf45c4e947a2af2ca0e1 (diff)
watchdog phase 2
Diffstat (limited to 'src/trex_watchdog.h')
-rw-r--r--src/trex_watchdog.h70
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__ */