7
7
#include " caliper/CaliperService.h"
8
8
9
9
#include " caliper/Caliper.h"
10
+ #include " caliper/SnapshotRecord.h"
10
11
11
12
#include " caliper/common/Log.h"
12
13
13
14
#include < atomic>
15
+ #include < mutex>
14
16
15
17
using namespace cali ;
16
18
@@ -25,6 +27,10 @@ class Statistics
25
27
std::atomic<unsigned > num_end;
26
28
std::atomic<unsigned > num_set;
27
29
30
+ std::mutex lock;
31
+
32
+ unsigned max_snapshot_len;
33
+
28
34
unsigned num_threads;
29
35
unsigned max_threads;
30
36
@@ -34,15 +40,47 @@ class Statistics
34
40
<< " \n Number of end events: " << num_end.load ()
35
41
<< " \n Number of set events: " << num_set.load ()
36
42
<< " \n Number of snapshots: " << num_snapshots.load ()
43
+ << " \n Max snapshot entries: " << max_snapshot_len
37
44
<< std::endl;
38
45
39
- if (chn->id () == 0 ) {
46
+ if (chn->id () == 0 ) {
40
47
// only print this for the default channel
41
48
42
49
auto vec = c->get_all_attributes ();
43
-
50
+
51
+ unsigned n_global = 0 ;
52
+ unsigned n_hidden_ref = 0 ;
53
+ unsigned n_hidden_val = 0 ;
54
+ unsigned n_val = 0 ;
55
+ unsigned n_ref = 0 ;
56
+
57
+ for (const Attribute& attr : vec) {
58
+ if (attr.is_hidden ()) {
59
+ if (attr.store_as_value ())
60
+ ++n_hidden_val;
61
+ else
62
+ ++n_hidden_ref;
63
+ continue ;
64
+ }
65
+
66
+ if (attr.is_global ()) {
67
+ ++n_global;
68
+ continue ;
69
+ }
70
+
71
+ if (attr.store_as_value ())
72
+ ++n_val;
73
+ else
74
+ ++n_ref;
75
+ }
76
+
44
77
Log (1 ).stream () << " Global statistics:"
45
78
<< " \n Number of attributes: " << vec.size ()
79
+ << " \n reference: " << n_ref
80
+ << " \n value: " << n_val
81
+ << " \n global: " << n_global
82
+ << " \n hidden: " << (n_hidden_ref + n_hidden_val)
83
+ << " (" << n_hidden_ref << " reference, " << n_hidden_val << " value)"
46
84
<< " \n Number of threads: " << num_threads
47
85
<< " (max " << max_threads << " )" << std::endl;
48
86
}
@@ -53,15 +91,16 @@ class Statistics
53
91
num_begin (0 ),
54
92
num_end(0 ),
55
93
num_set(0 ),
94
+ max_snapshot_len(0 ),
56
95
num_threads(1 ),
57
96
max_threads(1 )
58
97
{ }
59
98
60
99
public:
61
-
100
+
62
101
static void statistics_service_register (Caliper* c, Channel* chn) {
63
102
Statistics* instance = new Statistics;
64
-
103
+
65
104
chn->events ().pre_begin_evt .connect (
66
105
[instance](Caliper* c, Channel* chn, const Attribute&, const Variant&){
67
106
++instance->num_begin ;
@@ -75,9 +114,18 @@ class Statistics
75
114
++instance->num_set ;
76
115
});
77
116
chn->events ().snapshot .connect (
78
- [instance](Caliper*,Channel*,int ,const SnapshotRecord*,SnapshotRecord*){
117
+ [instance](Caliper*,Channel*,int ,const SnapshotRecord*,SnapshotRecord* rec ){
79
118
++instance->num_snapshots ;
80
119
});
120
+ chn->events ().process_snapshot .connect (
121
+ [instance](Caliper*,Channel*,const SnapshotRecord*,const SnapshotRecord* rec){
122
+ unsigned len = rec->num_nodes () + rec->num_immediate ();
123
+
124
+ std::lock_guard<std::mutex>
125
+ g (instance->lock );
126
+
127
+ instance->max_snapshot_len = std::max (len, instance->max_snapshot_len );
128
+ });
81
129
82
130
if (chn->id () == 0 ) {
83
131
chn->events ().create_thread_evt .connect (
@@ -91,7 +139,7 @@ class Statistics
91
139
--instance->num_threads ;
92
140
});
93
141
}
94
-
142
+
95
143
chn->events ().finish_evt .connect (
96
144
[instance](Caliper* c, Channel* chn){
97
145
instance->finish_cb (c, chn);
0 commit comments