artdaq_core  v3_05_07
StatisticsCollection.cc
1 #include "artdaq-core/Core/StatisticsCollection.hh"
2 #include <iostream>
3 
4 namespace artdaq {
6 {
7  static StatisticsCollection singletonInstance;
8  return singletonInstance;
9 }
10 
11 StatisticsCollection::StatisticsCollection()
12  : calculationInterval_(1.0)
13 {
14  thread_stop_requested_ = false;
15  try
16  {
17  calculation_thread_ = std::make_unique<boost::thread>(boost::bind(&StatisticsCollection::run, this));
18  }
19  catch (const boost::exception& e)
20  {
21  std::cerr << "Caught boost::exception starting Statistics Collection thread: " << boost::diagnostic_information(e) << ", errno=" << errno << std::endl;
22  exit(5);
23  }
24 }
25 
27 {
28  // stop and clean up the thread
29  requestStop();
30 
31  // Having issues where ~StatisticsCollection is being called from within thread due to signal handlers
32  if (calculation_thread_ && calculation_thread_->joinable() && calculation_thread_->get_id() != boost::this_thread::get_id()) calculation_thread_->join();
33 }
34 
36  addMonitoredQuantity(const std::string& name,
38 {
39  std::lock_guard<std::mutex> scopedLock(map_mutex_);
40  monitoredQuantityMap_[name] = mqPtr;
41 }
42 
44 StatisticsCollection::getMonitoredQuantity(const std::string& name) const
45 {
46  std::lock_guard<std::mutex> scopedLock(map_mutex_);
47  MonitoredQuantityPtr emptyResult;
48  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
49  iter = monitoredQuantityMap_.find(name);
50  if (iter == monitoredQuantityMap_.end()) { return emptyResult; }
51  return iter->second;
52 }
53 
55 {
56  std::lock_guard<std::mutex> scopedLock(map_mutex_);
57  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
58  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
59  iterEnd = monitoredQuantityMap_.end();
60  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
61  {
62  iter->second->reset();
63  }
64 }
65 
67 {
68  thread_stop_requested_ = true;
69 }
70 
72 {
73  while (!thread_stop_requested_)
74  {
75  long useconds = static_cast<long>(calculationInterval_ * 1000000);
76  usleep(useconds);
77  {
78  std::lock_guard<std::mutex> scopedLock(map_mutex_);
79  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
80  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
81  iterEnd = monitoredQuantityMap_.end();
82  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
83  {
84  iter->second->calculateStatistics();
85  }
86  }
87  }
88 }
89 } // namespace artdaq
void addMonitoredQuantity(const std::string &name, MonitoredQuantityPtr mqPtr)
Registers a new MonitoredQuantity to be tracked by the StatisticsCollection.
static StatisticsCollection & getInstance()
Returns the singleton instance of the StatisticsCollection.
void reset()
Reset all MonitoredQuantity object in this StatisticsCollection.
void requestStop()
Stops the statistics calculation thread.
virtual ~StatisticsCollection() noexcept
StatisticsCollection Destructor.
A collection of MonitoredQuantity instances describing low-level statistics of the artdaq system...
MonitoredQuantityPtr getMonitoredQuantity(const std::string &name) const
Lookup and return a MonitoredQuantity from the StatisticsCollection.
void run()
Start the background thread that performs MonitoredQuantity statistics calculation.
std::shared_ptr< MonitoredQuantity > MonitoredQuantityPtr
A shared_ptr to a MonitoredQuantity instance.