21 * questions.
22 *
23 */
24
25 #ifndef SHARE_GC_SHARED_WORKERDATAARRAY_HPP
26 #define SHARE_GC_SHARED_WORKERDATAARRAY_HPP
27
28 #include "memory/allocation.hpp"
29 #include "utilities/debug.hpp"
30
31 class outputStream;
32
33 template <class T>
34 class WorkerDataArray : public CHeapObj<mtGC> {
35 friend class WDAPrinter;
36 public:
37 static const uint MaxThreadWorkItems = 6;
38 private:
39 T* _data;
40 uint _length;
41 const char* _title;
42
43 bool _is_serial;
44
45 WorkerDataArray<size_t>* _thread_work_items[MaxThreadWorkItems];
46
47 public:
48 WorkerDataArray(const char* title, uint length, bool is_serial = false);
49 ~WorkerDataArray();
50
51 // Create an integer sub-item at the given index to this WorkerDataArray. If length_override
52 // is zero, use the same number of elements as this array, otherwise use the given
53 // number.
54 void create_thread_work_items(const char* title, uint index = 0, uint length_override = 0);
55
56 void set_thread_work_item(uint worker_i, size_t value, uint index = 0);
57 void add_thread_work_item(uint worker_i, size_t value, uint index = 0);
58 void set_or_add_thread_work_item(uint worker_i, size_t value, uint index = 0);
59 size_t get_thread_work_item(uint worker_i, uint index = 0);
60
61 WorkerDataArray<size_t>* thread_work_items(uint index = 0) const {
62 assert(index < MaxThreadWorkItems, "Tried to access thread work item %u max %u", index, MaxThreadWorkItems);
63 return _thread_work_items[index];
64 }
65
66 static T uninitialized();
67
68 void set(uint worker_i, T value);
69 T get(uint worker_i) const;
70
71 void add(uint worker_i, T value);
72
73 // The sum() and average() methods below consider uninitialized slots to be 0.
74 double average() const;
75 T sum() const;
76
77 const char* title() const {
78 return _title;
79 }
80
81 void reset();
82 void set_all(T value);
83
84
85 private:
86 class WDAPrinter {
87 public:
88 static void summary(outputStream* out, double time);
89 static void summary(outputStream* out, double min, double avg, double max, double diff, double sum, bool print_sum);
90 static void summary(outputStream* out, size_t value);
91 static void summary(outputStream* out, size_t min, double avg, size_t max, size_t diff, size_t sum, bool print_sum);
92
93 static void details(const WorkerDataArray<double>* phase, outputStream* out);
94 static void details(const WorkerDataArray<size_t>* phase, outputStream* out);
95 };
96
97 public:
98 void print_summary_on(outputStream* out, bool print_sum = true) const;
|
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_GC_SHARED_WORKERDATAARRAY_HPP
26 #define SHARE_GC_SHARED_WORKERDATAARRAY_HPP
27
28 #include "memory/allocation.hpp"
29 #include "utilities/debug.hpp"
30
31 class outputStream;
32
33 template <class T>
34 class WorkerDataArray : public CHeapObj<mtGC> {
35 friend class WDAPrinter;
36 public:
37 static const uint MaxThreadWorkItems = 6;
38 private:
39 T* _data;
40 uint _length;
41 const char* _short_name; // Short name for JFR
42 const char* _title; // Title for logging.
43
44 bool _is_serial;
45
46 WorkerDataArray<size_t>* _thread_work_items[MaxThreadWorkItems];
47
48 public:
49 WorkerDataArray(const char* short_name, const char* title, uint length, bool is_serial = false);
50 ~WorkerDataArray();
51
52 // Create an integer sub-item at the given index to this WorkerDataArray. If length_override
53 // is zero, use the same number of elements as this array, otherwise use the given
54 // number.
55 void create_thread_work_items(const char* title, uint index = 0, uint length_override = 0);
56
57 void set_thread_work_item(uint worker_i, size_t value, uint index = 0);
58 void add_thread_work_item(uint worker_i, size_t value, uint index = 0);
59 void set_or_add_thread_work_item(uint worker_i, size_t value, uint index = 0);
60 size_t get_thread_work_item(uint worker_i, uint index = 0);
61
62 WorkerDataArray<size_t>* thread_work_items(uint index = 0) const {
63 assert(index < MaxThreadWorkItems, "Tried to access thread work item %u max %u", index, MaxThreadWorkItems);
64 return _thread_work_items[index];
65 }
66
67 static T uninitialized();
68
69 void set(uint worker_i, T value);
70 T get(uint worker_i) const;
71
72 void add(uint worker_i, T value);
73
74 // The sum() and average() methods below consider uninitialized slots to be 0.
75 double average() const;
76 T sum() const;
77
78 const char* title() const {
79 return _title;
80 }
81
82 const char* short_name() const {
83 return _short_name;
84 }
85
86 void reset();
87 void set_all(T value);
88
89
90 private:
91 class WDAPrinter {
92 public:
93 static void summary(outputStream* out, double time);
94 static void summary(outputStream* out, double min, double avg, double max, double diff, double sum, bool print_sum);
95 static void summary(outputStream* out, size_t value);
96 static void summary(outputStream* out, size_t min, double avg, size_t max, size_t diff, size_t sum, bool print_sum);
97
98 static void details(const WorkerDataArray<double>* phase, outputStream* out);
99 static void details(const WorkerDataArray<size_t>* phase, outputStream* out);
100 };
101
102 public:
103 void print_summary_on(outputStream* out, bool print_sum = true) const;
|