CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
QualityMetric.cc
Go to the documentation of this file.
1 
2 #include <iostream>
3 
5 
6 #include "QualityMetric.h"
7 
8 #ifdef __MACH__
9 #include <mach/clock.h>
10 #include <mach/mach.h>
11 #define GET_CLOCK_MONOTONIC(ts) \
12 { \
13  clock_serv_t cclock; \
14  mach_timespec_t mts; \
15  host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); \
16  clock_get_time(cclock, &mts); \
17  mach_port_deallocate(mach_task_self(), cclock); \
18  ts.tv_sec = mts.tv_sec; \
19  ts.tv_nsec = mts.tv_nsec; \
20 }
21 #else
22 #define GET_CLOCK_MONOTONIC(ts) \
23  clock_gettime(CLOCK_MONOTONIC, &ts);
24 #endif
25 
26 
27 using namespace XrdAdaptor;
28 
30  : m_parent1(parent1), m_parent2(parent2)
31 {
32  // TODO: just assuming success.
34 }
35 
37 {
38  if (m_parent1 && m_parent2)
39  {
40  timespec stop;
41  GET_CLOCK_MONOTONIC(stop);
42 
43  int ms = 1000*(stop.tv_sec - m_start.tv_sec) + (stop.tv_nsec - m_start.tv_nsec)/1e6;
44  edm::LogVerbatim("XrdAdaptorInternal") << "Finished timer after " << ms << std::endl;
45  m_parent1->finishWatch(stop, ms);
46  m_parent2->finishWatch(stop, ms);
47  }
48 }
49 
51 {
52  m_parent1 = that.m_parent1;
53  m_parent2 = that.m_parent2;
54  m_start = that.m_start;
55  that.m_parent1 = nullptr;
56  that.m_parent2 = nullptr;
57  that.m_start = {0, 0};
58 }
59 
60 void
62 {
64  tmp = that.m_parent1;
65  that.m_parent1 = m_parent1;
66  m_parent1 = tmp;
67  tmp = that.m_parent2;
68  that.m_parent2 = m_parent2;
69  m_parent2 = tmp;
70  timespec tmp2;
71  tmp2 = that.m_start;
72  that.m_start = m_start;
73  m_start = tmp2;
74 }
75 
76 
77 QualityMetric::QualityMetric(timespec now, int default_value)
78  : m_value(default_value),
79  m_interval0_n(0),
80  m_interval0_val(-1),
81  m_interval0_start(now.tv_sec),
82  m_interval1_val(-1),
83  m_interval2_val(-1),
84  m_interval3_val(-1),
85  m_interval4_val(-1)
86 {
87 }
88 
89 void
90 QualityMetric::finishWatch(timespec stop, int ms)
91 {
92  std::unique_lock<std::mutex> sentry(m_mutex);
93 
94  m_value = -1;
95  if (stop.tv_sec > m_interval0_start+interval_length)
96  {
101  m_interval0_n = 1;
103  m_interval0_start = stop.tv_sec;
104  }
105  else
106  {
108  m_interval0_n++;
110  }
111 }
112 
113 unsigned
115 {
116  std::unique_lock<std::mutex> sentry(m_mutex);
117 
118  if (m_value == -1)
119  {
120  unsigned den = 0;
121  m_value = 0;
122  if (m_interval0_val >= 0)
123  {
124  den += 16;
126  }
127  if (m_interval1_val >= 0)
128  {
129  den += 8;
131  }
132  if (m_interval2_val >= 0)
133  {
134  den += 4;
136  }
137  if (m_interval3_val >= 0)
138  {
139  den += 2;
141  }
142  if (m_interval4_val >= 0)
143  {
144  den += 1;
146  }
147  if (den)
148  m_value /= den;
149  else
150  m_value = 260;
151  }
152  return m_value;
153 }
154 
156 
157 std::unique_ptr<QualityMetricSource>
159 {
160  MetricMap::const_iterator it = m_instance->m_sources.find(id);
162  if (it == m_instance->m_sources.end())
163  {
164  source = new QualityMetricUniqueSource(now);
165  m_instance->m_sources[id] = source;
166  }
167  else
168  {
169  source = it->second;
170  }
171  return source->newSource(now);
172 }
173 
175  : QualityMetric(now, default_value),
176  m_parent(parent)
177 {}
178 
179 void
181 {
183  watch.swap(tmp);
184 }
185 
187  : QualityMetric(now)
188 {}
189 
190 std::unique_ptr<QualityMetricSource>
192 {
193  std::unique_ptr<QualityMetricSource> child(new QualityMetricSource(*this, now, get()));
194  return child;
195 }
196 
list parent
Definition: dbtoconf.py:74
std::unique_ptr< QualityMetricSource > newSource(timespec now)
QualityMetric(timespec now, int default_value=260)
QualityMetricUniqueSource & m_parent
Definition: QualityMetric.h:87
void finishWatch(timespec now, int ms)
#define GET_CLOCK_MONOTONIC(ts)
static std::unique_ptr< QualityMetricSource > get(timespec now, const std::string &id)
QualityMetricSource(QualityMetricUniqueSource &parent, timespec now, int default_value)
static QualityMetricFactory * m_instance
Definition: QualityMetric.h:67
susybsm::MuonSegment ms
Definition: classes.h:31
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
void startWatch(QualityMetricWatch &)
void swap(QualityMetricWatch &)
static const unsigned interval_length
Definition: QualityMetric.h:45
static std::string const source
Definition: EdmProvDump.cc:42