artdaq_core  v3_01_05
StatisticsCollection.cc
1 #include "artdaq-core/Core/StatisticsCollection.hh"
2 
3 namespace artdaq
4 {
6  {
7  static StatisticsCollection singletonInstance;
8  return singletonInstance;
9  }
10 
11  StatisticsCollection::StatisticsCollection() : calculationInterval_(1.0)
12  {
13  thread_stop_requested_ = false;
14  calculation_thread_ = std::make_unique<boost::thread>(boost::bind(&StatisticsCollection::run, this));
15  }
16 
18  {
19  // stop and clean up the thread
20  requestStop();
21  calculation_thread_->join();
22  }
23 
25  addMonitoredQuantity(const std::string& name,
27  {
28  std::lock_guard<std::mutex> scopedLock(map_mutex_);
29  monitoredQuantityMap_[name] = mqPtr;
30  }
31 
33  StatisticsCollection::getMonitoredQuantity(const std::string& name) const
34  {
35  std::lock_guard<std::mutex> scopedLock(map_mutex_);
36  MonitoredQuantityPtr emptyResult;
37  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
38  iter = monitoredQuantityMap_.find(name);
39  if (iter == monitoredQuantityMap_.end()) { return emptyResult; }
40  return iter->second;
41  }
42 
44  {
45  std::lock_guard<std::mutex> scopedLock(map_mutex_);
46  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
47  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
48  iterEnd = monitoredQuantityMap_.end();
49  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
50  {
51  iter->second->reset();
52  }
53  }
54 
56  {
57  thread_stop_requested_ = true;
58  }
59 
61  {
62  while (!thread_stop_requested_)
63  {
64  long useconds = static_cast<long>(calculationInterval_ * 1000000);
65  usleep(useconds);
66  {
67  std::lock_guard<std::mutex> scopedLock(map_mutex_);
68  std::map<std::string, MonitoredQuantityPtr>::const_iterator iter;
69  std::map<std::string, MonitoredQuantityPtr>::const_iterator iterEnd;
70  iterEnd = monitoredQuantityMap_.end();
71  for (iter = monitoredQuantityMap_.begin(); iter != iterEnd; ++iter)
72  {
73  iter->second->calculateStatistics();
74  }
75  }
76  }
77  }
78 }
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.