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 33 class 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 60 class 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 118 class 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 196 class 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 237 class 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 247 class 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 264 class 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 277 class 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