summaryrefslogtreecommitdiffstats
path: root/src/trex_watchdog.h
blob: ecc90960d4608ec3001df5bf0aca56f3e1f600e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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 <string>
#include <vector>
#include <thread>

#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<monitor_st> m_monitors;


    volatile bool m_active;
    std::thread  *m_thread;
};

#endif /* __TREX_WATCHDOG_H__ */