artdaq_core  v3_04_02
StatisticsCollection.cc
1 #include "artdaq-core/Core/StatisticsCollection.hh"
2 #include <iostream>
3 
4 namespace artdaq
5 {
7  {
8  static StatisticsCollection singletonInstance;
9  return singletonInstance;
10  }
11 
12  StatisticsCollection::StatisticsCollection() : calculationInterval_(1.0)
13  {
14  thread_stop_requested_ = false;
15  try {
16  calculation_thread_ = std::make_unique<boost::thread>(boost::bind(&StatisticsCollection::run, this));
17  }
18  catch (const boost::exception& e)
19  {
20  std::cerr << "Caught boost::exception starting Statistics Collection thread: " << boost::diagnostic_information(e) << ", errno=" << errno << std::endl;
21  exit(5);
22  }
23  }
24 
26  {
27  // stop and clean up the thread
28  requestStop();
29 
30  // Having issues where ~StatisticsCollection is being called from within thread due to signal handlers
31  if(calculation_thread_ && calculation_thread_->joinable() && calculation_thread_->get_id() != boost::this_thread::get_id()) calculation_thread_->join();
32  }
33 
35  addMonitoredQuantity(const std::string& name,
37  {
38  std::lock_guard<std::mutex> scopedLock(map_mutex_);
39  monitoredQuantityMap_[name] = mqPtr;
40  }
41 
43  StatisticsCollection::getMonitoredQuantity(const std::string& name) const
44  {
45  std::lock_guard<std::mutex> scopedLock(map_mutex_);
46  MonitoredQuantityPtr emptyResult;
47  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
48  iter = monitoredQuantityMap_.find(name);
49  if (iter == monitoredQuantityMap_.end()) { return emptyResult; }
50  return iter->second;
51  }
52 
54  {
55  std::lock_guard<std::mutex> scopedLock(map_mutex_);
56  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
57  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
58  iterEnd = monitoredQuantityMap_.end();
59  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
60  {
61  iter->second->reset();
62  }
63  }
64 
66  {
67  thread_stop_requested_ = true;
68  }
69 
71  {
72  while (!thread_stop_requested_)
73  {
74  long useconds = static_cast<long>(calculationInterval_ * 1000000);
75  usleep(useconds);
76  {
77  std::lock_guard<std::mutex> scopedLock(map_mutex_);
78  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
79  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
80  iterEnd = monitoredQuantityMap_.end();
81  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
82  {
83  iter->second->calculateStatistics();
84  }
85  }
86  }
87  }
88 }
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.