OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
task_monitor.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __BASE_TASK_MONITOR_H__
6 #define __BASE_TASK_MONITOR_H__
7 
8 /****************************************************************************
9  * Monitor module for TBB.
10  * It is observed that TBB randomly goes into a state where no tasks are
11  * scheduled. The monitor here tracks the tasks enqueued and executed.
12  *
13  * If the monitor identifes that TBB is in a lockup state, then it will
14  * assert the process
15  ****************************************************************************/
16 #include <boost/asio/placeholders.hpp>
17 #include <boost/system/error_code.hpp>
18 
19 #include "util.h"
20 
21 class TaskScheduler;
22 class TimerImpl;
23 class EventManager;
24 
25 class TaskMonitor {
26 public:
28  uint64_t inactivity_time_msec, uint64_t poll_interval_msec);
29  ~TaskMonitor();
30 
31  void Start(EventManager *evm);
32  void Terminate();
33  void Run(const boost::system::error_code &ec);
34 
35  uint64_t last_activity() const { return last_activity_; }
36  uint64_t last_enqueue_count() const { return last_enqueue_count_; }
37  uint64_t last_done_count() const { return last_done_count_; }
38 
39  uint64_t inactivity_time_usec() const { return inactivity_time_usec_; }
40  uint64_t inactivity_time_msec() const { return inactivity_time_usec_/1000; }
41  uint64_t poll_interval_msec() const { return poll_interval_msec_; }
43  uint64_t poll_count() const { return poll_count_; }
44 private:
45  friend class TaskMonitorTest;
46 
47  void UpdateTimers();
48  void Restart();
49  bool Monitor(uint64_t t, uint64_t enqueue_count, uint64_t done_count);
50 
52  // Monitor terminated
53  bool cancelled_;
54  // ASIO Timer implementation class
55  std::unique_ptr<TimerImpl> timer_impl_;
56 
57  // inactivity in usec after which monitor must invoke assert()
59  // interval at which tbb must be monitored
61  // TBB keepawake time
63  // time of last activity seen
64  uint64_t last_activity_;
65  // TaskScheduler->enqueue_count() at last_change_
67  // TaskScheduler->done_count() at last_change_
68  uint64_t last_done_count_;
69  // Number of times monitor is run
70  uint64_t poll_count_;
72 };
73 
74 #endif // __BASE_TASK_MONITOR_H__
uint64_t inactivity_time_usec() const
Definition: task_monitor.h:39
uint64_t last_enqueue_count_
Definition: task_monitor.h:66
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
uint64_t inactivity_time_usec_
Definition: task_monitor.h:58
uint64_t poll_interval_msec_
Definition: task_monitor.h:60
uint64_t last_activity_
Definition: task_monitor.h:64
void Run(const boost::system::error_code &ec)
friend class TaskMonitorTest
Definition: task_monitor.h:45
void Restart()
Definition: task_monitor.cc:63
uint64_t poll_count_
Definition: task_monitor.h:70
uint64_t last_done_count_
Definition: task_monitor.h:68
uint64_t last_enqueue_count() const
Definition: task_monitor.h:36
void Terminate()
Definition: task_monitor.cc:59
uint64_t last_activity() const
Definition: task_monitor.h:35
bool cancelled_
Definition: task_monitor.h:53
TaskScheduler * scheduler_
Definition: task_monitor.h:51
uint64_t last_done_count() const
Definition: task_monitor.h:37
void UpdateTimers()
Definition: task_monitor.cc:31
void Start(EventManager *evm)
Definition: task_monitor.cc:49
uint64_t inactivity_time_msec() const
Definition: task_monitor.h:40
uint64_t poll_interval_msec() const
Definition: task_monitor.h:41
uint64_t poll_count() const
Definition: task_monitor.h:43
std::unique_ptr< TimerImpl > timer_impl_
Definition: task_monitor.h:55
uint64_t tbb_keepawake_time_msec() const
Definition: task_monitor.h:42
uint64_t tbb_keepawake_time_msec_
Definition: task_monitor.h:62
DISALLOW_COPY_AND_ASSIGN(TaskMonitor)
TaskMonitor(TaskScheduler *scheduler, uint64_t tbb_keepawake_time_msec, uint64_t inactivity_time_msec, uint64_t poll_interval_msec)
Definition: task_monitor.cc:16
static EventManager evm
bool Monitor(uint64_t t, uint64_t enqueue_count, uint64_t done_count)
Definition: task_monitor.cc:73