1/*
2 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_RUNTIME_OS_PERF_HPP
26#define SHARE_RUNTIME_OS_PERF_HPP
27
28#include "memory/allocation.hpp"
29#include "utilities/macros.hpp"
30
31#define FUNCTIONALITY_NOT_IMPLEMENTED -8
32
33class EnvironmentVariable : public CHeapObj<mtInternal> {
34 public:
35 char* _key;
36 char* _value;
37
38 EnvironmentVariable() {
39 _key = NULL;
40 _value = NULL;
41 }
42
43 ~EnvironmentVariable() {
44 if (_key != NULL) {
45 FREE_C_HEAP_ARRAY(char, _key);
46 }
47 if (_value != NULL) {
48 FREE_C_HEAP_ARRAY(char, _value);
49 }
50 }
51
52 EnvironmentVariable(char* key, char* value) {
53 _key = key;
54 _value = value;
55 }
56
57};
58
59
60class CPUInformation : public CHeapObj<mtInternal> {
61 private:
62 int _no_of_sockets;
63 int _no_of_cores;
64 int _no_of_hw_threads;
65 const char* _description;
66 const char* _name;
67
68 public:
69 CPUInformation() {
70 _no_of_sockets = 0;
71 _no_of_cores = 0;
72 _no_of_hw_threads = 0;
73 _description = NULL;
74 _name = NULL;
75 }
76
77 int number_of_sockets(void) const {
78 return _no_of_sockets;
79 }
80
81 void set_number_of_sockets(int no_of_sockets) {
82 _no_of_sockets = no_of_sockets;
83 }
84
85 int number_of_cores(void) const {
86 return _no_of_cores;
87 }
88
89 void set_number_of_cores(int no_of_cores) {
90 _no_of_cores = no_of_cores;
91 }
92
93 int number_of_hardware_threads(void) const {
94 return _no_of_hw_threads;
95 }
96
97 void set_number_of_hardware_threads(int no_of_hw_threads) {
98 _no_of_hw_threads = no_of_hw_threads;
99 }
100
101 const char* cpu_name(void) const {
102 return _name;
103 }
104
105 void set_cpu_name(const char* cpu_name) {
106 _name = cpu_name;
107 }
108
109 const char* cpu_description(void) const {
110 return _description;
111 }
112
113 void set_cpu_description(const char* cpu_description) {
114 _description = cpu_description;
115 }
116};
117
118class SystemProcess : public CHeapObj<mtInternal> {
119 private:
120 int _pid;
121 char* _name;
122 char* _path;
123 char* _command_line;
124 SystemProcess* _next;
125
126 public:
127 SystemProcess() {
128 _pid = 0;
129 _name = NULL;
130 _path = NULL;
131 _command_line = NULL;
132 _next = NULL;
133 }
134
135 SystemProcess(int pid, char* name, char* path, char* command_line, SystemProcess* next) {
136 _pid = pid;
137 _name = name;
138 _path = path;
139 _command_line = command_line;
140 _next = next;
141 }
142
143 void set_next(SystemProcess* sys_process) {
144 _next = sys_process;
145 }
146
147 SystemProcess* next(void) const {
148 return _next;
149 }
150
151 int pid(void) const {
152 return _pid;
153 }
154
155 void set_pid(int pid) {
156 _pid = pid;
157 }
158
159 const char* name(void) const {
160 return _name;
161 }
162
163 void set_name(char* name) {
164 _name = name;
165 }
166
167 const char* path(void) const {
168 return _path;
169 }
170
171 void set_path(char* path) {
172 _path = path;
173 }
174
175 const char* command_line(void) const {
176 return _command_line;
177 }
178
179 void set_command_line(char* command_line) {
180 _command_line = command_line;
181 }
182
183 virtual ~SystemProcess(void) {
184 if (_name != NULL) {
185 FREE_C_HEAP_ARRAY(char, _name);
186 }
187 if (_path != NULL) {
188 FREE_C_HEAP_ARRAY(char, _path);
189 }
190 if (_command_line != NULL) {
191 FREE_C_HEAP_ARRAY(char, _command_line);
192 }
193 }
194};
195
196class NetworkInterface : public ResourceObj {
197 private:
198 char* _name;
199 uint64_t _bytes_in;
200 uint64_t _bytes_out;
201 NetworkInterface* _next;
202
203 NetworkInterface(); // no impl
204 NetworkInterface(const NetworkInterface& rhs); // no impl
205 NetworkInterface& operator=(const NetworkInterface& rhs); // no impl
206 public:
207 NetworkInterface(const char* name, uint64_t bytes_in, uint64_t bytes_out, NetworkInterface* next) :
208 _name(NULL),
209 _bytes_in(bytes_in),
210 _bytes_out(bytes_out),
211 _next(next) {
212 assert(name != NULL, "invariant");
213 const size_t length = strlen(name);
214 assert(allocated_on_res_area(), "invariant");
215 _name = NEW_RESOURCE_ARRAY(char, length + 1);
216 strncpy(_name, name, length + 1);
217 assert(strncmp(_name, name, length) == 0, "invariant");
218 }
219
220 NetworkInterface* next() const {
221 return _next;
222 }
223
224 const char* get_name() const {
225 return _name;
226 }
227
228 uint64_t get_bytes_out() const {
229 return _bytes_out;
230 }
231
232 uint64_t get_bytes_in() const {
233 return _bytes_in;
234 }
235};
236
237class CPUInformationInterface : public CHeapObj<mtInternal> {
238 private:
239 CPUInformation* _cpu_info;
240 public:
241 CPUInformationInterface();
242 bool initialize();
243 ~CPUInformationInterface();
244 int cpu_information(CPUInformation& cpu_info);
245};
246
247class CPUPerformanceInterface : public CHeapObj<mtInternal> {
248 private:
249 class CPUPerformance;
250 CPUPerformance* _impl;
251 public:
252 CPUPerformanceInterface();
253 ~CPUPerformanceInterface();
254 bool initialize();
255
256 int cpu_load(int which_logical_cpu, double* const cpu_load) const;
257 int context_switch_rate(double* const rate) const;
258 int cpu_load_total_process(double* const cpu_load) const;
259 int cpu_loads_process(double* const pjvmUserLoad,
260 double* const pjvmKernelLoad,
261 double* const psystemTotalLoad) const;
262};
263
264class SystemProcessInterface : public CHeapObj<mtInternal> {
265 private:
266 class SystemProcesses;
267 SystemProcesses* _impl;
268 public:
269 SystemProcessInterface();
270 ~SystemProcessInterface();
271 bool initialize();
272
273 // information about system processes
274 int system_processes(SystemProcess** system_procs, int* const no_of_sys_processes) const;
275};
276
277class NetworkPerformanceInterface : public CHeapObj<mtInternal> {
278 private:
279 class NetworkPerformance;
280 NetworkPerformance* _impl;
281 NetworkPerformanceInterface(const NetworkPerformanceInterface& rhs); // no impl
282 NetworkPerformanceInterface& operator=(const NetworkPerformanceInterface& rhs); // no impl
283 public:
284 NetworkPerformanceInterface();
285 bool initialize();
286 ~NetworkPerformanceInterface();
287 int network_utilization(NetworkInterface** network_interfaces) const;
288};
289
290#endif // SHARE_RUNTIME_OS_PERF_HPP
291