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