src/hotspot/os/bsd/os_perf_bsd.cpp
author egahlin
Tue, 15 May 2018 20:24:34 +0200
changeset 50113 caf115bb98ad
child 50879 d90c3cbf13df
permissions -rw-r--r--
8199712: Flight Recorder Reviewed-by: coleenp, ihse, erikj, dsamersoff, mseledtsov, egahlin, mgronlun Contributed-by: erik.gahlin@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
#include "precompiled.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#include "memory/allocation.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
#include "memory/resourceArea.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "runtime/os.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "runtime/os_perf.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "vm_version_ext_x86.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#ifdef __APPLE__
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
  #import <libproc.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
  #include <sys/time.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
  #include <sys/sysctl.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
  #include <mach/mach.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
  #include <mach/task_info.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
static const double NANOS_PER_SEC = 1000000000.0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
class CPUPerformanceInterface::CPUPerformance : public CHeapObj<mtInternal> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
   friend class CPUPerformanceInterface;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
  long _total_cpu_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
  long _total_csr_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
  long _jvm_user_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
  long _jvm_system_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
  long _jvm_context_switches;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
  long _used_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
  long _total_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
  int  _active_processor_count;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
  bool now_in_nanos(long* resultp) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
    timeval current_time;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
    if (gettimeofday(&current_time, NULL) != 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
      // Error getting current time
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
      return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
    *resultp = current_time.tv_sec * NANOS_PER_SEC + 1000L * current_time.tv_usec;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
  double normalize(double value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
    return MIN2<double>(MAX2<double>(value, 0.0), 1.0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
  int cpu_load(int which_logical_cpu, double* cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
  int context_switch_rate(double* rate);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
  int cpu_load_total_process(double* cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
  int cpu_loads_process(double* pjvmUserLoad, double* pjvmKernelLoad, double* psystemTotalLoad);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
  CPUPerformance(const CPUPerformance& rhs); // no impl
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
  CPUPerformance& operator=(const CPUPerformance& rhs); // no impl
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
 public:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
  CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
  bool initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
  ~CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
CPUPerformanceInterface::CPUPerformance::CPUPerformance() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
  _total_cpu_nanos= 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
  _total_csr_nanos= 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
  _jvm_context_switches = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
  _jvm_user_nanos = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
  _jvm_system_nanos = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
  _used_ticks = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
  _total_ticks = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
  _active_processor_count = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
bool CPUPerformanceInterface::CPUPerformance::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
CPUPerformanceInterface::CPUPerformance::~CPUPerformance() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
int CPUPerformanceInterface::CPUPerformance::cpu_load(int which_logical_cpu, double* cpu_load) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  return FUNCTIONALITY_NOT_IMPLEMENTED;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
int CPUPerformanceInterface::CPUPerformance::cpu_load_total_process(double* cpu_load) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
#ifdef __APPLE__
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
  host_name_port_t host = mach_host_self();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
  host_flavor_t flavor = HOST_CPU_LOAD_INFO;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
  mach_msg_type_number_t host_info_count = HOST_CPU_LOAD_INFO_COUNT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
  host_cpu_load_info_data_t cpu_load_info;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
  kern_return_t kr = host_statistics(host, flavor, (host_info_t)&cpu_load_info, &host_info_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
  if (kr != KERN_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  long used_ticks  = cpu_load_info.cpu_ticks[CPU_STATE_USER] + cpu_load_info.cpu_ticks[CPU_STATE_NICE] + cpu_load_info.cpu_ticks[CPU_STATE_SYSTEM];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
  long total_ticks = used_ticks + cpu_load_info.cpu_ticks[CPU_STATE_IDLE];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
  if (_used_ticks == 0 || _total_ticks == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
    // First call, just set the values
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
    _used_ticks  = used_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
    _total_ticks = total_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
  long used_delta  = used_ticks - _used_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
  long total_delta = total_ticks - _total_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
  _used_ticks  = used_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
  _total_ticks = total_ticks;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
  if (total_delta == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    // Avoid division by zero
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
  *cpu_load = (double)used_delta / total_delta;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
#else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
  return FUNCTIONALITY_NOT_IMPLEMENTED;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
int CPUPerformanceInterface::CPUPerformance::cpu_loads_process(double* pjvmUserLoad, double* pjvmKernelLoad, double* psystemTotalLoad) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
#ifdef __APPLE__
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
  int result = cpu_load_total_process(psystemTotalLoad);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  mach_port_t task = mach_task_self();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  mach_msg_type_number_t task_info_count = TASK_INFO_MAX;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
  task_info_data_t task_info_data;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
  kern_return_t kr = task_info(task, TASK_ABSOLUTETIME_INFO, (task_info_t)task_info_data, &task_info_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
  if (kr != KERN_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
  task_absolutetime_info_t absolutetime_info = (task_absolutetime_info_t)task_info_data;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
  int active_processor_count = os::active_processor_count();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
  long jvm_user_nanos = absolutetime_info->total_user;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
  long jvm_system_nanos = absolutetime_info->total_system;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
  long total_cpu_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
  if(!now_in_nanos(&total_cpu_nanos)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
  if (_total_cpu_nanos == 0 || active_processor_count != _active_processor_count) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
    // First call or change in active processor count
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
    result = OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
  long delta_nanos = active_processor_count * (total_cpu_nanos - _total_cpu_nanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
  if (delta_nanos == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
    // Avoid division by zero
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
  *pjvmUserLoad = normalize((double)(jvm_user_nanos - _jvm_user_nanos)/delta_nanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
  *pjvmKernelLoad = normalize((double)(jvm_system_nanos - _jvm_system_nanos)/delta_nanos);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
  _active_processor_count = active_processor_count;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
  _total_cpu_nanos = total_cpu_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
  _jvm_user_nanos = jvm_user_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  _jvm_system_nanos = jvm_system_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
  return result;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
#else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
  return FUNCTIONALITY_NOT_IMPLEMENTED;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
int CPUPerformanceInterface::CPUPerformance::context_switch_rate(double* rate) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
#ifdef __APPLE__
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
  mach_port_t task = mach_task_self();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
  mach_msg_type_number_t task_info_count = TASK_INFO_MAX;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
  task_info_data_t task_info_data;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
  kern_return_t kr = task_info(task, TASK_EVENTS_INFO, (task_info_t)task_info_data, &task_info_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  if (kr != KERN_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
  int result = OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
  if (_total_csr_nanos == 0 || _jvm_context_switches == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    // First call just set initial values.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
    result = OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
  long jvm_context_switches = ((task_events_info_t)task_info_data)->csw;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  long total_csr_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
  if(!now_in_nanos(&total_csr_nanos)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
  double delta_in_sec = (double)(total_csr_nanos - _total_csr_nanos) / NANOS_PER_SEC;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
  if (delta_in_sec == 0.0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    // Avoid division by zero
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
  *rate = (jvm_context_switches - _jvm_context_switches) / delta_in_sec;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
  _jvm_context_switches = jvm_context_switches;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
  _total_csr_nanos = total_csr_nanos;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
  return result;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
#else
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
  return FUNCTIONALITY_NOT_IMPLEMENTED;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
CPUPerformanceInterface::CPUPerformanceInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
  _impl = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
bool CPUPerformanceInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
  _impl = new CPUPerformanceInterface::CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
  return _impl != NULL && _impl->initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
CPUPerformanceInterface::~CPUPerformanceInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
  if (_impl != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
    delete _impl;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
int CPUPerformanceInterface::cpu_load(int which_logical_cpu, double* cpu_load) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  return _impl->cpu_load(which_logical_cpu, cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
int CPUPerformanceInterface::cpu_load_total_process(double* cpu_load) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
  return _impl->cpu_load_total_process(cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
int CPUPerformanceInterface::cpu_loads_process(double* pjvmUserLoad, double* pjvmKernelLoad, double* psystemTotalLoad) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
  return _impl->cpu_loads_process(pjvmUserLoad, pjvmKernelLoad, psystemTotalLoad);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
int CPUPerformanceInterface::context_switch_rate(double* rate) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
  return _impl->context_switch_rate(rate);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
class SystemProcessInterface::SystemProcesses : public CHeapObj<mtInternal> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
  friend class SystemProcessInterface;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
  SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
  bool initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
  SystemProcesses(const SystemProcesses& rhs); // no impl
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
  SystemProcesses& operator=(const SystemProcesses& rhs); // no impl
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
  ~SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
  //information about system processes
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
  int system_processes(SystemProcess** system_processes, int* no_of_sys_processes) const;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
SystemProcessInterface::SystemProcesses::SystemProcesses() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
bool SystemProcessInterface::SystemProcesses::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
SystemProcessInterface::SystemProcesses::~SystemProcesses() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
int SystemProcessInterface::SystemProcesses::system_processes(SystemProcess** system_processes, int* no_of_sys_processes) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
  assert(system_processes != NULL, "system_processes pointer is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
  assert(no_of_sys_processes != NULL, "system_processes counter pointer is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
#ifdef __APPLE__
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
  pid_t* pids = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
  int pid_count = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
  int try_count = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
  while (pids == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
    // Find out buffer size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
    size_t pids_bytes = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
    if (pids_bytes <= 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    pid_count = pids_bytes / sizeof(pid_t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
    pids = NEW_RESOURCE_ARRAY(pid_t, pid_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
    memset(pids, 0, pids_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
    pids_bytes = proc_listpids(PROC_ALL_PIDS, 0, pids, pids_bytes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
    if (pids_bytes <= 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
       // couldn't fit buffer, retry.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
      FREE_RESOURCE_ARRAY(pid_t, pids, pid_count);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
      pids = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
      try_count++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
      if (try_count > 3) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
    } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
      pid_count = pids_bytes / sizeof(pid_t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   310
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   311
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   312
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
  int process_count = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
  SystemProcess* next = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
  for (int i = 0; i < pid_count; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
    pid_t pid = pids[i];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
    if (pid != 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
      char buffer[PROC_PIDPATHINFO_MAXSIZE];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
      memset(buffer, 0 , sizeof(buffer));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
      if (proc_pidpath(pid, buffer, sizeof(buffer)) != -1) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
        int length = strlen(buffer);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
        if (length > 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
          SystemProcess* current = new SystemProcess();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
          char * path = NEW_C_HEAP_ARRAY(char, length + 1, mtInternal);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
          strcpy(path, buffer);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
          current->set_path(path);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
          current->set_pid((int)pid);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
          current->set_next(next);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
          next = current;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
          process_count++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
  *no_of_sys_processes = process_count;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
  *system_processes = next;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
#endif
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
  return FUNCTIONALITY_NOT_IMPLEMENTED;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
int SystemProcessInterface::system_processes(SystemProcess** system_procs, int* no_of_sys_processes) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
  return _impl->system_processes(system_procs, no_of_sys_processes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
SystemProcessInterface::SystemProcessInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
  _impl = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
bool SystemProcessInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
  _impl = new SystemProcessInterface::SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
  return _impl != NULL && _impl->initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
SystemProcessInterface::~SystemProcessInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
  if (_impl != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
    delete _impl;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
 }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
CPUInformationInterface::CPUInformationInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
  _cpu_info = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
bool CPUInformationInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
  _cpu_info = new CPUInformation();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
  if (NULL == _cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
  _cpu_info->set_number_of_hardware_threads(VM_Version_Ext::number_of_threads());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
  _cpu_info->set_number_of_cores(VM_Version_Ext::number_of_cores());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
  _cpu_info->set_number_of_sockets(VM_Version_Ext::number_of_sockets());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
  _cpu_info->set_cpu_name(VM_Version_Ext::cpu_name());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
  _cpu_info->set_cpu_description(VM_Version_Ext::cpu_description());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
CPUInformationInterface::~CPUInformationInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
  if (_cpu_info != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
    if (_cpu_info->cpu_name() != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
      const char* cpu_name = _cpu_info->cpu_name();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
      FREE_C_HEAP_ARRAY(char, cpu_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   387
      _cpu_info->set_cpu_name(NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   388
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
    if (_cpu_info->cpu_description() != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
      const char* cpu_desc = _cpu_info->cpu_description();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
      FREE_C_HEAP_ARRAY(char, cpu_desc);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
      _cpu_info->set_cpu_description(NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
    delete _cpu_info;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
int CPUInformationInterface::cpu_information(CPUInformation& cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
  if (NULL == _cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
  cpu_info = *_cpu_info; // shallow copy assignment
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
}