1
#pragma once
2

            
3
#include "envoy/common/pure.h"
4
#include "envoy/event/dispatcher.h"
5
#include "envoy/server/watchdog.h"
6

            
7
namespace Envoy {
8
namespace Server {
9

            
10
/**
11
 * The GuardDog runs a background thread which scans a number of shared WatchDog
12
 * objects periodically to verify that they have been recently touched. If some
13
 * of the watched items have not responded the GuardDog will take action ranging
14
 * from stats counter increments to killing the entire process (if a deadlock is
15
 * suspected).
16
 *
17
 * The lifespan of the GuardDog thread is tied to the lifespan of this object.
18
 */
19
class GuardDog {
20
public:
21
21674
  virtual ~GuardDog() = default;
22

            
23
  /**
24
   * Get a WatchDog object pointer to a new WatchDog.
25
   *
26
   * After this method returns the WatchDog object must be touched periodically
27
   * to avoid triggering the GuardDog. If no longer needed use the
28
   * stopWatching() method to remove it from the list of watched objects.
29
   *
30
   * @param thread_id a Thread::ThreadId containing the system thread id
31
   * @param thread_name supplies the name of the thread which is used for per-thread miss stats.
32
   * @param dispatcher dispatcher responsible for petting the watchdog.
33
   */
34
  virtual WatchDogSharedPtr createWatchDog(Thread::ThreadId thread_id,
35
                                           const std::string& thread_name,
36
                                           Event::Dispatcher& dispatcher) PURE;
37

            
38
  /**
39
   * Tell the GuardDog to forget about this WatchDog.
40
   * After calling this method it is no longer necessary to touch the WatchDog
41
   * object.
42
   *
43
   * @param wd A WatchDogSharedPtr obtained from createWatchDog.
44
   */
45
  virtual void stopWatching(WatchDogSharedPtr wd) PURE;
46
};
47

            
48
} // namespace Server
49
} // namespace Envoy