src/hotspot/os/windows/os_perf_windows.cpp
author lkorinth
Wed, 11 Sep 2019 14:16:30 +0200
changeset 58084 cddef3bde924
parent 58083 9046db64ca39
child 58282 03fce7b04b42
permissions -rw-r--r--
8230398: Remove NULL checks before FREE_C_HEAP_ARRAY Reviewed-by: dholmes, kbarrett, tschatzl
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
53882
ca682d9d8db5 8214777: Avoid some GCC 8.X strncpy() errors in HotSpot
mikael
parents: 50879
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
50113
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
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
#include "precompiled.hpp"
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
    26
#include "iphlp_interface.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
#include "logging/log.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
#include "memory/allocation.inline.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
#include "memory/resourceArea.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
#include "pdh_interface.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
#include "runtime/os_perf.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
#include "runtime/os.hpp"
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
    33
#include "utilities/macros.hpp"
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
#include "vm_version_ext_x86.hpp"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
#include <math.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
#include <psapi.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
#include <TlHelp32.h>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
 * Windows provides a vast plethora of performance objects and counters,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
 * consumption of which is assisted using the Performance Data Helper (PDH) interface.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
 * We import a selected few api entry points from PDH, see pdh_interface.hpp.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
 * The code located in this file is to a large extent an abstraction over much of the
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
 * plumbing needed to start consuming an object and/or counter of choice.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
 /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
 * How to use:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
 * 1. Create query
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
 * 2. Add counters to the query
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
 * 3. Collect the performance data using the query
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
 * 4. Display the performance data using the counters associated with the query
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
 * 5. Destroy query (counter destruction implied)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
 * Every PDH artifact, like processor, process, thread, memory, and so forth are
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
 * identified with an index that is always the same irrespective
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
 * of the localized version of the operating system or service pack installed.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
 * INFO: Using PDH APIs Correctly in a Localized Language (Q287159)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
 *   http://support.microsoft.com/default.aspx?scid=kb;EN-US;q287159
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
 * To find the correct index for an object or counter, inspect the registry key / value:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
 * [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009\Counter]
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
 * some common PDH indexes
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
static const DWORD PDH_PROCESSOR_IDX = 238;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
static const DWORD PDH_PROCESSOR_TIME_IDX = 6;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
static const DWORD PDH_PRIV_PROCESSOR_TIME_IDX = 144;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
static const DWORD PDH_PROCESS_IDX = 230;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
static const DWORD PDH_ID_PROCESS_IDX = 784;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
static const DWORD PDH_CONTEXT_SWITCH_RATE_IDX = 146;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
static const DWORD PDH_SYSTEM_IDX = 2;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
/* useful pdh fmt's */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
static const char* const OBJECT_COUNTER_FMT = "\\%s\\%s";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
static const size_t OBJECT_COUNTER_FMT_LEN = 2;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
static const char* const OBJECT_WITH_INSTANCES_COUNTER_FMT = "\\%s(%s)\\%s";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
static const size_t OBJECT_WITH_INSTANCES_COUNTER_FMT_LEN = 4;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
static const char* const PROCESS_OBJECT_INSTANCE_COUNTER_FMT = "\\%s(%s#%s)\\%s";
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
static const size_t PROCESS_OBJECT_INSTANCE_COUNTER_FMT_LEN = 5;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
static const char* process_image_name = NULL; // for example, "java" but could have another image name
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
static char* pdh_IDProcess_counter_fmt = NULL;   // "\Process(java#%d)\ID Process" */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
// Need to limit how often we update a query to minimize the heisenberg effect.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
// (PDH behaves erratically if the counters are queried too often, especially counters that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
// store and use values from two consecutive updates, like cpu load.)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
static const int min_update_interval_millis = 500;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
* Structs for PDH queries.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
typedef struct {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
  HQUERY query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
  s8     lastUpdate; // Last time query was updated (current millis).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
} UpdateQueryS, *UpdateQueryP;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
typedef struct {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
  UpdateQueryS query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
  HCOUNTER     counter;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
  bool         initialized;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
} CounterQueryS, *CounterQueryP;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
typedef struct {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
  UpdateQueryS query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
  HCOUNTER*    counters;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
  int          noOfCounters;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
  bool         initialized;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
} MultiCounterQueryS, *MultiCounterQueryP;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
typedef struct {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
  MultiCounterQueryP queries;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
  int                size;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
  bool               initialized;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
} MultiCounterQuerySetS, *MultiCounterQuerySetP;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   122
typedef struct {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   123
  MultiCounterQuerySetS set;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   124
  int                   process_index;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   125
} ProcessQueryS, *ProcessQueryP;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   126
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
static void pdh_cleanup(HQUERY* const query, HCOUNTER* const counter) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
  if (counter != NULL && *counter != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
    PdhDll::PdhRemoveCounter(*counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    *counter = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
  if (query != NULL && *query != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    PdhDll::PdhCloseQuery(*query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
    *query = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
static CounterQueryP create_counter_query() {
58083
9046db64ca39 8227168: Cleanup usage of NEW_C_HEAP_ARRAY
lkorinth
parents: 53882
diff changeset
   139
  CounterQueryP const query = NEW_C_HEAP_OBJ(CounterQueryS, mtInternal);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
  memset(query, 0, sizeof(CounterQueryS));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
  return query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
static void destroy_counter_query(CounterQueryP query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
  assert(query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
  pdh_cleanup(&query->query.query, &query->counter);
58083
9046db64ca39 8227168: Cleanup usage of NEW_C_HEAP_ARRAY
lkorinth
parents: 53882
diff changeset
   147
  FREE_C_HEAP_OBJ(query);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
static MultiCounterQueryP create_multi_counter_query() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
  MultiCounterQueryP const query = NEW_C_HEAP_ARRAY(MultiCounterQueryS, 1, mtInternal);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
  memset(query, 0, sizeof(MultiCounterQueryS));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
  return query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
static void destroy_counter_query(MultiCounterQueryP counter_query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
  if (counter_query != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
    for (int i = 0; i < counter_query->noOfCounters; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
      pdh_cleanup(NULL, &counter_query->counters[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
    FREE_C_HEAP_ARRAY(char, counter_query->counters);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
    pdh_cleanup(&counter_query->query.query, NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
    FREE_C_HEAP_ARRAY(MultiCounterQueryS, counter_query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   167
static void destroy_multi_counter_query(MultiCounterQuerySetP counter_query_set) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
  for (int i = 0; i < counter_query_set->size; i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
    for (int j = 0; j < counter_query_set->queries[i].noOfCounters; ++j) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
      pdh_cleanup(NULL, &counter_query_set->queries[i].counters[j]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
    FREE_C_HEAP_ARRAY(char, counter_query_set->queries[i].counters);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
    pdh_cleanup(&counter_query_set->queries[i].query.query, NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
  FREE_C_HEAP_ARRAY(MultiCounterQueryS, counter_query_set->queries);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   176
}
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   177
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   178
static void destroy_counter_query(MultiCounterQuerySetP counter_query_set) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   179
  destroy_multi_counter_query(counter_query_set);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
  FREE_C_HEAP_ARRAY(MultiCounterQuerySetS, counter_query_set);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   183
static void destroy_counter_query(ProcessQueryP process_query) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   184
  destroy_multi_counter_query(&process_query->set);
58083
9046db64ca39 8227168: Cleanup usage of NEW_C_HEAP_ARRAY
lkorinth
parents: 53882
diff changeset
   185
  FREE_C_HEAP_OBJ(process_query);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   186
}
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   187
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
static int open_query(HQUERY* query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
  return PdhDll::PdhOpenQuery(NULL, 0, query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
template <typename QueryP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
static int open_query(QueryP query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
  return open_query(&query->query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
static int allocate_counters(MultiCounterQueryP query, size_t nofCounters) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
  assert(query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
  assert(!query->initialized, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
  assert(0 == query->noOfCounters, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
  assert(query->counters == NULL, "invariant");
58083
9046db64ca39 8227168: Cleanup usage of NEW_C_HEAP_ARRAY
lkorinth
parents: 53882
diff changeset
   202
  query->counters = NEW_C_HEAP_ARRAY(HCOUNTER, nofCounters, mtInternal);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
  if (query->counters == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
  memset(query->counters, 0, nofCounters * sizeof(HCOUNTER));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
  query->noOfCounters = (int)nofCounters;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
static int allocate_counters(MultiCounterQuerySetP query_set, size_t nofCounters) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
  assert(query_set != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
  assert(!query_set->initialized, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
  for (int i = 0; i < query_set->size; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
    if (allocate_counters(&query_set->queries[i], nofCounters) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   222
static int allocate_counters(ProcessQueryP process_query, size_t nofCounters) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   223
  assert(process_query != NULL, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   224
  return allocate_counters(&process_query->set, nofCounters);
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   225
}
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   226
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
static void deallocate_counters(MultiCounterQueryP query) {
58084
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   228
  FREE_C_HEAP_ARRAY(char, query->counters);
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   229
  query->counters = NULL;
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   230
  query->noOfCounters = 0;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
static OSReturn add_counter(UpdateQueryP query, HCOUNTER* counter, const char* path, bool first_sample_on_init) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
  assert(query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
  assert(counter != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
  assert(path != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
  if (query->query == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
    if (open_query(query) != ERROR_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
      return OS_ERR;
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
  assert(query->query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
  PDH_STATUS status = PdhDll::PdhAddCounter(query->query, path, 0, counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
  if (PDH_CSTATUS_NO_OBJECT == status || PDH_CSTATUS_NO_COUNTER == status) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
  /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
  * According to the MSDN documentation, rate counters must be read twice:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
  *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
  * "Obtaining the value of rate counters such as Page faults/sec requires that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
  *  PdhCollectQueryData be called twice, with a specific time interval between
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
  *  the two calls, before calling PdhGetFormattedCounterValue. Call Sleep to
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
  *  implement the waiting period between the two calls to PdhCollectQueryData."
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
  *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
  *  Take the first sample here already to allow for the next "real" sample
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
  *  to succeed.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
  */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
  if (first_sample_on_init) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
    PdhDll::PdhCollectQueryData(query->query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
template <typename QueryP>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
static OSReturn add_counter(QueryP counter_query, HCOUNTER* counter, const char* path, bool first_sample_on_init) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
  assert(counter_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
  assert(counter != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
  assert(path != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
  return add_counter(&counter_query->query, counter, path, first_sample_on_init);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
static OSReturn add_counter(CounterQueryP counter_query, const char* path, bool first_sample_on_init) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
  if (add_counter(counter_query, &counter_query->counter, path, first_sample_on_init) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
    // performance counter might be disabled in the registry
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
  counter_query->initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
static OSReturn add_process_counter(MultiCounterQueryP query, int slot_index, const char* path, bool first_sample_on_init) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
  assert(query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
  assert(slot_index < query->noOfCounters, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
  assert(query->counters[slot_index] == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
  const OSReturn ret = add_counter(query, &query->counters[slot_index], path, first_sample_on_init);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
  if (OS_OK == ret) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
    if (slot_index + 1 == query->noOfCounters) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
      query->initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
  return ret;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
static int collect_query_data(UpdateQueryP update_query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
  assert(update_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
  const s8 now = os::javaTimeMillis();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   297
  if (now - update_query->lastUpdate > min_update_interval_millis) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   298
    if (PdhDll::PdhCollectQueryData(update_query->query) != ERROR_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   299
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   300
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   301
    update_query->lastUpdate = now;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   302
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   303
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   304
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   305
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   306
template <typename Query>
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   307
static int collect_query_data(Query* counter_query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   308
  assert(counter_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   309
  return collect_query_data(&counter_query->query);
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
static int formatted_counter_value(HCOUNTER counter, DWORD format, PDH_FMT_COUNTERVALUE* const value) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   313
  assert(value != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   314
  if (PdhDll::PdhGetFormattedCounterValue(counter, format, NULL, value) != ERROR_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   317
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   318
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   319
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   320
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
* Working against the Process object and it's related counters is inherently problematic
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
* when using the PDH API:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
* Using PDH, a process is not primarily identified by the process id,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
* but with a sequential number, for example \Process(java#0), \Process(java#1), ...
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
* The really bad part is that this list is reset as soon as a process exits:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
* If \Process(java#1) exits, \Process(java#3) now becomes \Process(java#2) etc.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
* The PDH api requires a process identifier to be submitted when registering
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
* a query, but as soon as the list resets, the query is invalidated (since the name changed).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
* Solution:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
* The #number identifier for a Process query can only decrease after process creation.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
* We therefore create an array of counter queries for all process object instances
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
* up to and including ourselves:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
* Ex. we come in as third process instance (java#2), we then create and register
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
* queries for the following Process object instances:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
* java#0, java#1, java#2
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
* current_query_index_for_process() keeps track of the current "correct" query
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
* (in order to keep this index valid when the list resets from underneath,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
* ensure to call current_query_index_for_process() before every query involving
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
* Process object instance data).
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   346
*
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   347
* if unable to query, returns OS_ERR(-1)
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
static int current_query_index_for_process() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
  assert(process_image_name != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
  assert(pdh_IDProcess_counter_fmt != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
  HQUERY tmpQuery = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
  if (open_query(&tmpQuery) != ERROR_SUCCESS) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   354
    return OS_ERR;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
  char counter[512];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
  HCOUNTER handle_counter = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
  // iterate over all instance indexes and try to find our own pid
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
  for (int index = 0; index < max_intx; index++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
    jio_snprintf(counter, sizeof(counter) - 1, pdh_IDProcess_counter_fmt, index);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   361
    assert(strlen(counter) < sizeof(counter), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
    if (PdhDll::PdhAddCounter(tmpQuery, counter, 0, &handle_counter) != ERROR_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
      pdh_cleanup(&tmpQuery, &handle_counter);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   364
      return OS_ERR;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
    const PDH_STATUS res = PdhDll::PdhCollectQueryData(tmpQuery);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
    if (res == PDH_INVALID_HANDLE || res == PDH_NO_DATA) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
      pdh_cleanup(&tmpQuery, &handle_counter);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   369
      return OS_ERR;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
    } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
      PDH_FMT_COUNTERVALUE counter_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
      formatted_counter_value(handle_counter, PDH_FMT_LONG, &counter_value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
      pdh_cleanup(NULL, &handle_counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
      if ((LONG)os::current_process_id() == counter_value.longValue) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
        pdh_cleanup(&tmpQuery, NULL);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
        return index;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
  pdh_cleanup(&tmpQuery, NULL);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   381
  return OS_ERR;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   384
static ProcessQueryP create_process_query() {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
  const int current_process_idx = current_query_index_for_process();
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   386
  if (OS_ERR == current_process_idx) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   387
    return NULL;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   388
  }
58083
9046db64ca39 8227168: Cleanup usage of NEW_C_HEAP_ARRAY
lkorinth
parents: 53882
diff changeset
   389
  ProcessQueryP const process_query = NEW_C_HEAP_OBJ(ProcessQueryS, mtInternal);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   390
  memset(process_query, 0, sizeof(ProcessQueryS));
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   391
  process_query->set.queries = NEW_C_HEAP_ARRAY(MultiCounterQueryS, current_process_idx + 1, mtInternal);
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   392
  memset(process_query->set.queries, 0, sizeof(MultiCounterQueryS) * (current_process_idx + 1));
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   393
  process_query->process_index = current_process_idx;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   394
  process_query->set.size = current_process_idx + 1;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   395
  assert(process_query->set.size > process_query->process_index, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   396
  return process_query;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   399
static MultiCounterQueryP current_process_counter_query(ProcessQueryP process_query) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   400
  assert(process_query != NULL, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   401
  assert(process_query->process_index < process_query->set.size, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   402
  return &process_query->set.queries[process_query->process_index];
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
static void clear_multi_counter(MultiCounterQueryP query) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
  for (int i = 0; i < query->noOfCounters; ++i) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
    pdh_cleanup(NULL, &query->counters[i]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
  pdh_cleanup(&query->query.query, NULL);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   410
  query->initialized = false;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   413
static int ensure_valid_process_query_index(ProcessQueryP process_query) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   414
  assert(process_query != NULL, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   415
  const int previous_process_idx = process_query->process_index;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   416
  if (previous_process_idx == 0) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   417
    return previous_process_idx;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   418
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
  const int current_process_idx = current_query_index_for_process();
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   420
  if (current_process_idx == previous_process_idx || OS_ERR == current_process_idx ||
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   421
    current_process_idx >= process_query->set.size) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   422
    return previous_process_idx;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   424
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   425
  assert(current_process_idx >= 0 && current_process_idx < process_query->set.size, "out of bounds!");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   426
  while (current_process_idx < process_query->set.size - 1) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   427
    const int new_size = --process_query->set.size;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   428
    clear_multi_counter(&process_query->set.queries[new_size]);
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   429
  }
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   430
  assert(current_process_idx < process_query->set.size, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   431
  process_query->process_index = current_process_idx;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   432
  return current_process_idx;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   435
static MultiCounterQueryP current_process_query(ProcessQueryP process_query) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   436
  assert(process_query != NULL, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   437
  const int current_process_idx = ensure_valid_process_query_index(process_query);
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   438
  assert(current_process_idx == process_query->process_index, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   439
  assert(current_process_idx < process_query->set.size, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   440
  return &process_query->set.queries[current_process_idx];
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   441
}
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   442
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   443
static int collect_process_query_data(ProcessQueryP process_query) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   444
  assert(process_query != NULL, "invariant");
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   445
  return collect_query_data(current_process_query(process_query));
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   446
}
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   447
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   448
static int query_process_counter(ProcessQueryP process_query, int slot_index, DWORD format, PDH_FMT_COUNTERVALUE* const value) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   449
  MultiCounterQueryP const current_query = current_process_counter_query(process_query);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
  assert(current_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
  assert(slot_index < current_query->noOfCounters, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   452
  assert(current_query->counters[slot_index] != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
  return formatted_counter_value(current_query->counters[slot_index], format, value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   454
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   455
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   456
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   457
 * Construct a fully qualified PDH path
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   458
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   459
 * @param objectName   a PDH Object string representation(required)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   460
 * @param counterName  a PDH Counter string representation(required)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   461
 * @param imageName    a process image name string, ex. "java" (opt)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   462
 * @param instance     an instance string, ex. "0", "1", ... (opt)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   463
 * @return             the fully qualified PDH path.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   464
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   465
 * Caller will need a ResourceMark.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   466
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   467
 * (PdhMakeCounterPath() seems buggy on concatenating instances, hence this function instead)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   468
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   469
static const char* make_fully_qualified_counter_path(const char* object_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   470
                                                     const char* counter_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   471
                                                     const char* image_name = NULL,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   472
                                                     const char* instance = NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   473
  assert(object_name != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   474
  assert(counter_name != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   475
  size_t full_counter_path_len = strlen(object_name) + strlen(counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   476
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   477
  char* full_counter_path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   478
  size_t jio_snprintf_result = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   479
  if (image_name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   480
    /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   481
    * For paths using the "Process" Object.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   482
    *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   483
    * Examples:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   484
    * form:   "\object_name(image_name#instance)\counter_name"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   485
    * actual: "\Process(java#2)\ID Process"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   486
    */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   487
    full_counter_path_len += PROCESS_OBJECT_INSTANCE_COUNTER_FMT_LEN;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   488
    full_counter_path_len += strlen(image_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   489
    /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   490
    * image_name must be passed together with an associated
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   491
    * instance "number" ("0", "1", "2", ...).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   492
    * This is required in order to create valid "Process" Object paths.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   493
    *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   494
    * Examples: "\Process(java#0)", \Process(java#1"), ...
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   495
    */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   496
    assert(instance != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   497
    full_counter_path_len += strlen(instance);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   498
    full_counter_path = NEW_RESOURCE_ARRAY_RETURN_NULL(char, full_counter_path_len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   499
    if (full_counter_path == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   500
      return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   501
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   502
    jio_snprintf_result = jio_snprintf(full_counter_path,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   503
                                       full_counter_path_len + 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   504
                                       PROCESS_OBJECT_INSTANCE_COUNTER_FMT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   505
                                       object_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   506
                                       image_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   507
                                       instance,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   508
                                       counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   509
  } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   510
    if (instance) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   511
      /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   512
      * For paths where the Object has multiple instances.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   513
      *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   514
      * Examples:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   515
      * form:   "\object_name(instance)\counter_name"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   516
      * actual: "\Processor(0)\% Privileged Time"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   517
      */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   518
      full_counter_path_len += strlen(instance);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   519
      full_counter_path_len += OBJECT_WITH_INSTANCES_COUNTER_FMT_LEN;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   520
    } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   521
      /*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   522
      * For "normal" paths.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   523
      *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   524
      * Examples:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   525
      * form:   "\object_name\counter_name"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   526
      * actual: "\Memory\Available Mbytes"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   527
      */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   528
      full_counter_path_len += OBJECT_COUNTER_FMT_LEN;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   529
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   530
    full_counter_path = NEW_RESOURCE_ARRAY_RETURN_NULL(char, full_counter_path_len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   531
    if (full_counter_path == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   532
      return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   533
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   534
    if (instance) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   535
      jio_snprintf_result = jio_snprintf(full_counter_path,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   536
                                         full_counter_path_len + 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   537
                                         OBJECT_WITH_INSTANCES_COUNTER_FMT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   538
                                         object_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   539
                                         instance,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   540
                                         counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   541
    } else {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   542
      jio_snprintf_result = jio_snprintf(full_counter_path,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   543
                                         full_counter_path_len + 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   544
                                         OBJECT_COUNTER_FMT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   545
                                         object_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   546
                                         counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   547
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   548
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   549
  assert(full_counter_path_len == jio_snprintf_result, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   550
  return full_counter_path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   551
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   552
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   553
static void log_invalid_pdh_index(DWORD index) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   554
  log_warning(os)("Unable to resolve PDH index: (%ld)", index);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   555
  log_warning(os)("Please check the registry if this performance object/counter is disabled");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   556
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   557
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   558
static bool is_valid_pdh_index(DWORD index) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   559
  DWORD dummy = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   560
  if (PdhDll::PdhLookupPerfNameByIndex(NULL, index, NULL, &dummy) != PDH_MORE_DATA) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   561
    log_invalid_pdh_index(index);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   562
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   563
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   564
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   565
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   566
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   567
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   568
 * Maps an index to a resource area allocated string for the localized PDH artifact.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   569
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   570
 * Caller will need a ResourceMark.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   571
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   572
 * @param index    the counter index as specified in the registry
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   573
 * @param ppBuffer pointer to a char*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   574
 * @return         OS_OK if successful, OS_ERR on failure.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   575
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   576
static OSReturn lookup_name_by_index(DWORD index, char** p_string) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   577
  assert(p_string != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   578
  if (!is_valid_pdh_index(index)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   579
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   580
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   581
  // determine size needed
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   582
  DWORD size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   583
  PDH_STATUS status = PdhDll::PdhLookupPerfNameByIndex(NULL, index, NULL, &size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   584
  assert(status == PDH_MORE_DATA, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   585
  *p_string = NEW_RESOURCE_ARRAY_RETURN_NULL(char, size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   586
  if (*p_string== NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   587
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   588
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   589
  if (PdhDll::PdhLookupPerfNameByIndex(NULL, index, *p_string, &size) != ERROR_SUCCESS) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   590
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   591
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   592
  if (0 == size || *p_string == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   593
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   594
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   595
  // windows vista does not null-terminate the string (although the docs says it will)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   596
  (*p_string)[size - 1] = '\0';
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   597
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   598
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   599
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   600
static const char* copy_string_to_c_heap(const char* string) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   601
  assert(string != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   602
  const size_t len = strlen(string);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   603
  char* const cheap_allocated_string = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   604
  if (NULL == cheap_allocated_string) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   605
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   606
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   607
  strncpy(cheap_allocated_string, string, len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   608
  return cheap_allocated_string;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   609
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   610
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   611
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   612
* Maps an index to a resource area allocated string for the localized PDH artifact.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   613
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   614
* Caller will need a ResourceMark.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   615
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   616
* @param index    the counter index as specified in the registry
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   617
* @return         localized pdh artifact string if successful, NULL on failure.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   618
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   619
static const char* pdh_localized_artifact(DWORD pdh_artifact_index) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   620
  char* pdh_localized_artifact_string = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   621
  // get localized name from pdh artifact index
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   622
  if (lookup_name_by_index(pdh_artifact_index, &pdh_localized_artifact_string) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   623
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   624
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   625
  return pdh_localized_artifact_string;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   626
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   627
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   628
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   629
 * Returns the PDH string identifying the current process image name.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   630
 * Use this prefix when getting counters from the PDH process object
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   631
 * representing your process.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   632
 * Ex. "Process(java#0)\Virtual Bytes" - where "java" is the PDH process
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   633
 * image description.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   634
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   635
 * Caller needs ResourceMark.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   636
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   637
 * @return the process image description. NULL if the call failed.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   638
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   639
static const char* pdh_process_image_name() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   640
  char* module_name = NEW_RESOURCE_ARRAY_RETURN_NULL(char, MAX_PATH);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   641
  if (NULL == module_name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   642
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   643
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   644
  // Find our module name and use it to extract the image name used by PDH
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   645
  DWORD getmfn_return = GetModuleFileName(NULL, module_name, MAX_PATH);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   646
  if (getmfn_return >= MAX_PATH || 0 == getmfn_return) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   647
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   648
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   649
  if (os::get_last_error() == ERROR_INSUFFICIENT_BUFFER) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   650
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   651
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   652
  char* process_image_name = strrchr(module_name, '\\'); //drop path
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   653
  process_image_name++;                                  //skip slash
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   654
  char* dot_pos = strrchr(process_image_name, '.');      //drop .exe
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   655
  dot_pos[0] = '\0';
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   656
  return process_image_name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   657
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   658
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   659
static void deallocate_pdh_constants() {
58084
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   660
  FREE_C_HEAP_ARRAY(char, process_image_name);
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   661
  process_image_name = NULL;
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   662
  FREE_C_HEAP_ARRAY(char, pdh_IDProcess_counter_fmt);
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
   663
  pdh_IDProcess_counter_fmt = NULL;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   664
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   665
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   666
static int allocate_pdh_constants() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   667
  assert(process_image_name == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   668
  const char* pdh_image_name = pdh_process_image_name();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   669
  if (pdh_image_name == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   670
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   671
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   672
  process_image_name = copy_string_to_c_heap(pdh_image_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   673
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   674
  const char* pdh_localized_process_object = pdh_localized_artifact(PDH_PROCESS_IDX);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   675
  if (pdh_localized_process_object == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   676
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   677
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   678
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   679
  const char* pdh_localized_IDProcess_counter = pdh_localized_artifact(PDH_ID_PROCESS_IDX);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   680
  if (pdh_localized_IDProcess_counter == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   681
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   682
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   683
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   684
  size_t pdh_IDProcess_counter_fmt_len = strlen(process_image_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   685
  pdh_IDProcess_counter_fmt_len += strlen(pdh_localized_process_object);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   686
  pdh_IDProcess_counter_fmt_len += strlen(pdh_localized_IDProcess_counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   687
  pdh_IDProcess_counter_fmt_len += PROCESS_OBJECT_INSTANCE_COUNTER_FMT_LEN;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   688
  pdh_IDProcess_counter_fmt_len += 2; // "%d"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   689
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   690
  assert(pdh_IDProcess_counter_fmt == NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   691
  pdh_IDProcess_counter_fmt = NEW_C_HEAP_ARRAY_RETURN_NULL(char, pdh_IDProcess_counter_fmt_len + 1, mtInternal);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   692
  if (pdh_IDProcess_counter_fmt == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   693
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   694
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   695
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   696
  /* "\Process(java#%d)\ID Process" */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   697
  const size_t len = jio_snprintf(pdh_IDProcess_counter_fmt,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   698
                                  pdh_IDProcess_counter_fmt_len + 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   699
                                  PROCESS_OBJECT_INSTANCE_COUNTER_FMT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   700
                                  pdh_localized_process_object,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   701
                                  process_image_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   702
                                  "%d",
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   703
                                  pdh_localized_IDProcess_counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   704
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   705
  assert(pdh_IDProcess_counter_fmt != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   706
  assert(len == pdh_IDProcess_counter_fmt_len, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   707
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   708
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   709
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   710
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   711
 * Enuerate the Processor PDH object and returns a buffer containing the enumerated instances.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   712
 * Caller needs ResourceMark;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   713
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   714
 * @return  buffer if successful, NULL on failure.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   715
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   716
static const char* enumerate_cpu_instances() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   717
  char* processor; //'Processor' == PDH_PROCESSOR_IDX
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   718
  if (lookup_name_by_index(PDH_PROCESSOR_IDX, &processor) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   719
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   720
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   721
  DWORD c_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   722
  DWORD i_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   723
  // enumerate all processors.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   724
  PDH_STATUS pdhStat = PdhDll::PdhEnumObjectItems(NULL, // reserved
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   725
                                                  NULL, // local machine
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   726
                                                  processor, // object to enumerate
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   727
                                                  NULL,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   728
                                                  &c_size,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   729
                                                  NULL, // instance buffer is NULL and
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   730
                                                  &i_size,  // pass 0 length in order to get the required size
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   731
                                                  PERF_DETAIL_WIZARD, // counter detail level
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   732
                                                  0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   733
  if (PdhDll::PdhStatusFail((pdhStat))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   734
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   735
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   736
  char* const instances = NEW_RESOURCE_ARRAY_RETURN_NULL(char, i_size);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   737
  if (instances == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   738
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   739
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   740
  c_size = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   741
  pdhStat = PdhDll::PdhEnumObjectItems(NULL, // reserved
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   742
                                       NULL, // local machine
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   743
                                       processor, // object to enumerate
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   744
                                       NULL,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   745
                                       &c_size,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   746
                                       instances, // now instance buffer is allocated to be filled in
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   747
                                       &i_size, // and the required size is known
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   748
                                       PERF_DETAIL_WIZARD, // counter detail level
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   749
                                       0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   750
  if (PdhDll::PdhStatusFail((pdhStat))) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   751
    return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   752
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   753
  return instances;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   754
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   755
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   756
static int count_logical_cpus(const char* instances) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   757
  assert(instances != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   758
  // count logical instances.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   759
  DWORD count;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   760
  char* tmp;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   761
  for (count = 0, tmp = const_cast<char*>(instances); *tmp != '\0'; tmp = &tmp[strlen(tmp) + 1], count++);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   762
  // PDH reports an instance for each logical processor plus an instance for the total (_Total)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   763
  assert(count == os::processor_count() + 1, "invalid enumeration!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   764
  return count - 1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   765
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   766
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   767
static int number_of_logical_cpus() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   768
  static int numberOfCPUS = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   769
  if (numberOfCPUS == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   770
    const char* instances = enumerate_cpu_instances();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   771
    if (instances == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   772
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   773
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   774
    numberOfCPUS = count_logical_cpus(instances);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   775
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   776
  return numberOfCPUS;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   777
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   778
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   779
static double cpu_factor() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   780
  static DWORD  numCpus = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   781
  static double cpuFactor = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   782
  if (numCpus == 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   783
    numCpus = number_of_logical_cpus();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   784
    assert(os::processor_count() <= (int)numCpus, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   785
    cpuFactor = numCpus * 100;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   786
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   787
  return cpuFactor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   788
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   789
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   790
static void log_error_message_on_no_PDH_artifact(const char* full_counter_name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   791
  log_warning(os)("Unable to register PDH query for \"%s\"", full_counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   792
  log_warning(os)("Please check the registry if this performance object/counter is disabled");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   793
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   794
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   795
static int initialize_cpu_query_counters(MultiCounterQueryP cpu_query, DWORD pdh_counter_idx) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   796
  assert(cpu_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   797
  assert(cpu_query->counters != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   798
  char* processor; //'Processor' == PDH_PROCESSOR_IDX
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   799
  if (lookup_name_by_index(PDH_PROCESSOR_IDX, &processor) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   800
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   801
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   802
  char* counter_name = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   803
  if (lookup_name_by_index(pdh_counter_idx, &counter_name) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   804
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   805
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   806
  if (cpu_query->query.query == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   807
    if (open_query(cpu_query)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   808
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   809
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   810
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   811
  assert(cpu_query->query.query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   812
  size_t counter_len = strlen(processor);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   813
  counter_len += strlen(counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   814
  counter_len += OBJECT_WITH_INSTANCES_COUNTER_FMT_LEN; // "\\%s(%s)\\%s"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   815
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   816
  DWORD index;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   817
  char* tmp;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   818
  const char* instances = enumerate_cpu_instances();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   819
  for (index = 0, tmp = const_cast<char*>(instances); *tmp != '\0'; tmp = &tmp[strlen(tmp) + 1], index++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   820
    const size_t tmp_len = strlen(tmp);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   821
    char* counter_path = NEW_RESOURCE_ARRAY_RETURN_NULL(char, counter_len + tmp_len + 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   822
    if (counter_path == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   823
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   824
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   825
    const size_t jio_snprintf_result = jio_snprintf(counter_path,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   826
                                                    counter_len + tmp_len + 1,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   827
                                                    OBJECT_WITH_INSTANCES_COUNTER_FMT,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   828
                                                    processor,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   829
                                                    tmp, // instance "0", "1", .."_Total"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   830
                                                    counter_name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   831
    assert(counter_len + tmp_len == jio_snprintf_result, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   832
    if (add_counter(cpu_query, &cpu_query->counters[index], counter_path, false) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   833
      // performance counter is disabled in registry and not accessible via PerfLib
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   834
      log_error_message_on_no_PDH_artifact(counter_path);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   835
      // return OS_OK to have the system continue to run without the missing counter
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   836
      return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   837
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   838
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   839
  cpu_query->initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   840
  // Query once to initialize the counters which require at least two samples
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   841
  // (like the % CPU usage) to calculate correctly.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   842
  collect_query_data(cpu_query);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   843
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   844
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   845
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   846
static int initialize_cpu_query(MultiCounterQueryP cpu_query, DWORD pdh_counter_idx) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   847
  assert(cpu_query != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   848
  assert(!cpu_query->initialized, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   849
  const int logical_cpu_count = number_of_logical_cpus();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   850
  assert(logical_cpu_count >= os::processor_count(), "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   851
  // we also add another counter for instance "_Total"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   852
  if (allocate_counters(cpu_query, logical_cpu_count + 1) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   853
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   854
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   855
  assert(cpu_query->noOfCounters == logical_cpu_count + 1, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   856
  return initialize_cpu_query_counters(cpu_query, pdh_counter_idx);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   857
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   858
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   859
static int initialize_process_counter(ProcessQueryP process_query, int slot_index, DWORD pdh_counter_index) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   860
  char* localized_process_object;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   861
  if (lookup_name_by_index(PDH_PROCESS_IDX, &localized_process_object) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   862
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   863
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   864
  assert(localized_process_object != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   865
  char* localized_counter_name;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   866
  if (lookup_name_by_index(pdh_counter_index, &localized_counter_name) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   867
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   868
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   869
  assert(localized_counter_name != NULL, "invariant");
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   870
  for (int i = 0; i < process_query->set.size; ++i) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   871
    char instanceIndexBuffer[32];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   872
    const char* counter_path = make_fully_qualified_counter_path(localized_process_object,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   873
                                                                 localized_counter_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   874
                                                                 process_image_name,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   875
                                                                 itoa(i, instanceIndexBuffer, 10));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   876
    if (counter_path == NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   877
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   878
    }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   879
    MultiCounterQueryP const query = &process_query->set.queries[i];
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   880
    if (add_process_counter(query, slot_index, counter_path, true)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   881
      return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   882
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   883
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   884
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   885
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   886
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   887
static CounterQueryP create_counter_query(DWORD pdh_object_idx, DWORD pdh_counter_idx) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   888
  if (!((is_valid_pdh_index(pdh_object_idx) && is_valid_pdh_index(pdh_counter_idx)))) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   889
    return NULL;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   890
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   891
  CounterQueryP const query = create_counter_query();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   892
  const char* object = pdh_localized_artifact(pdh_object_idx);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   893
  assert(object != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   894
  const char* counter = pdh_localized_artifact(pdh_counter_idx);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   895
  assert(counter != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   896
  const char* full_counter_path = make_fully_qualified_counter_path(object, counter);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   897
  assert(full_counter_path != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   898
  add_counter(query, full_counter_path, true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   899
  return query;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   900
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   901
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   902
static void deallocate() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   903
  deallocate_pdh_constants();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   904
  PdhDll::PdhDetach();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   905
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   906
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   907
static LONG critical_section = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   908
static LONG reference_count = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   909
static bool pdh_initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   910
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   911
static void on_initialization_failure() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   912
  // still holder of critical section
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   913
  deallocate();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   914
  InterlockedExchangeAdd(&reference_count, -1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   915
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   916
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   917
static OSReturn initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   918
  ResourceMark rm;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   919
  if (!PdhDll::PdhAttach()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   920
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   921
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   922
  if (allocate_pdh_constants() != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   923
    on_initialization_failure();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   924
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   925
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   926
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   927
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   928
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   929
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   930
* Helper to initialize the PDH library, function pointers, constants and counters.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   931
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   932
* Reference counting allows for unloading of pdh.dll granted all sessions use the pair:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   933
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   934
*   pdh_acquire();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   935
*   pdh_release();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   936
*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   937
* @return  OS_OK if successful, OS_ERR on failure.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   938
*/
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   939
static bool pdh_acquire() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   940
  while (InterlockedCompareExchange(&critical_section, 1, 0) == 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   941
  InterlockedExchangeAdd(&reference_count, 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   942
  if (pdh_initialized) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   943
    return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   944
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   945
  const OSReturn ret = initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   946
  if (OS_OK == ret) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   947
    pdh_initialized = true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   948
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   949
  while (InterlockedCompareExchange(&critical_section, 0, 1) == 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   950
  return ret == OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   951
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   952
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   953
static void pdh_release() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   954
  while (InterlockedCompareExchange(&critical_section, 1, 0) == 1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   955
  const LONG prev_ref_count = InterlockedExchangeAdd(&reference_count, -1);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   956
  if (1 == prev_ref_count) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   957
    deallocate();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   958
    pdh_initialized = false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   959
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   960
  while (InterlockedCompareExchange(&critical_section, 0, 1) == 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   961
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   962
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   963
class CPUPerformanceInterface::CPUPerformance : public CHeapObj<mtInternal> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   964
  friend class CPUPerformanceInterface;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   965
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   966
  CounterQueryP _context_switches;
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
   967
  ProcessQueryP _process_cpu_load;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   968
  MultiCounterQueryP _machine_cpu_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   969
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   970
  int cpu_load(int which_logical_cpu, double* cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   971
  int context_switch_rate(double* rate);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   972
  int cpu_load_total_process(double* cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   973
  int cpu_loads_process(double* jvm_user_load, double* jvm_kernel_load, double* psystemTotalLoad);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   974
  CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   975
  ~CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   976
  bool initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   977
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   978
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   979
class SystemProcessInterface::SystemProcesses : public CHeapObj<mtInternal> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   980
  friend class SystemProcessInterface;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   981
 private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   982
  class ProcessIterator : public CHeapObj<mtInternal> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   983
    friend class SystemProcessInterface::SystemProcesses;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   984
   private:
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   985
    HANDLE         _hProcessSnap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   986
    PROCESSENTRY32 _pe32;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   987
    BOOL           _valid;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   988
    char           _exePath[MAX_PATH];
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   989
    ProcessIterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   990
    ~ProcessIterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   991
    bool initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   992
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   993
    int current(SystemProcess* const process_info);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   994
    int next_process();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   995
    bool is_valid() const { return _valid != FALSE; }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   996
    char* allocate_string(const char* str) const;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   997
    int snapshot();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   998
  };
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   999
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1000
  ProcessIterator* _iterator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1001
  SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1002
  ~SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1003
  bool initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1004
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1005
  // information about system processes
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1006
  int system_processes(SystemProcess** system_processes, int* no_of_sys_processes) const;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1007
};
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1008
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1009
CPUPerformanceInterface::CPUPerformance::CPUPerformance() : _context_switches(NULL), _process_cpu_load(NULL), _machine_cpu_load(NULL) {}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1010
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1011
bool CPUPerformanceInterface::CPUPerformance::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1012
  if (!pdh_acquire()) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1013
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1014
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1015
  _context_switches = create_counter_query(PDH_SYSTEM_IDX, PDH_CONTEXT_SWITCH_RATE_IDX);
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1016
  _process_cpu_load = create_process_query();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1017
  if (_process_cpu_load == NULL) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1018
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1019
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1020
  if (allocate_counters(_process_cpu_load, 2) != OS_OK) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1021
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1022
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1023
  if (initialize_process_counter(_process_cpu_load, 0, PDH_PROCESSOR_TIME_IDX) != OS_OK) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1024
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1025
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1026
  if (initialize_process_counter(_process_cpu_load, 1, PDH_PRIV_PROCESSOR_TIME_IDX) != OS_OK) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1027
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1028
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1029
  _process_cpu_load->set.initialized = true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1030
  _machine_cpu_load = create_multi_counter_query();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1031
  if (_machine_cpu_load == NULL) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1032
    return true;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1033
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1034
  initialize_cpu_query(_machine_cpu_load, PDH_PROCESSOR_TIME_IDX);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1035
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1036
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1037
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1038
CPUPerformanceInterface::CPUPerformance::~CPUPerformance() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1039
  if (_context_switches != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1040
    destroy_counter_query(_context_switches);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1041
    _context_switches = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1042
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1043
  if (_process_cpu_load != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1044
    destroy_counter_query(_process_cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1045
    _process_cpu_load = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1046
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1047
  if (_machine_cpu_load != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1048
    destroy_counter_query(_machine_cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1049
    _machine_cpu_load = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1050
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1051
  pdh_release();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1052
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1053
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1054
CPUPerformanceInterface::CPUPerformanceInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1055
  _impl = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1056
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1057
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1058
bool CPUPerformanceInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1059
  _impl = new CPUPerformanceInterface::CPUPerformance();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1060
  return _impl != NULL && _impl->initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1061
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1062
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1063
CPUPerformanceInterface::~CPUPerformanceInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1064
  if (_impl != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1065
    delete _impl;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1066
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1067
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1068
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1069
int CPUPerformanceInterface::cpu_load(int which_logical_cpu, double* cpu_load) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1070
  return _impl->cpu_load(which_logical_cpu, cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1071
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1072
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1073
int CPUPerformanceInterface::context_switch_rate(double* rate) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1074
  return _impl->context_switch_rate(rate);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1075
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1076
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1077
int CPUPerformanceInterface::cpu_load_total_process(double* cpu_load) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1078
  return _impl->cpu_load_total_process(cpu_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1079
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1080
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1081
int CPUPerformanceInterface::cpu_loads_process(double* pjvmUserLoad,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1082
                                               double* pjvmKernelLoad,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1083
                                               double* psystemTotalLoad) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1084
  return _impl->cpu_loads_process(pjvmUserLoad, pjvmKernelLoad, psystemTotalLoad);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1085
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1086
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1087
int CPUPerformanceInterface::CPUPerformance::cpu_load(int which_logical_cpu, double* cpu_load) {
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1088
  *cpu_load = .0;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1089
  if (_machine_cpu_load == NULL || !_machine_cpu_load->initialized) {
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1090
    return OS_ERR;
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1091
  }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1092
  assert(_machine_cpu_load != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1093
  assert(which_logical_cpu < _machine_cpu_load->noOfCounters, "invariant");
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1094
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1095
  if (collect_query_data(_machine_cpu_load)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1096
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1097
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1098
  // -1 is total (all cpus)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1099
  const int counter_idx = -1 == which_logical_cpu ? _machine_cpu_load->noOfCounters - 1 : which_logical_cpu;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1100
  PDH_FMT_COUNTERVALUE counter_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1101
  formatted_counter_value(_machine_cpu_load->counters[counter_idx], PDH_FMT_DOUBLE, &counter_value);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1102
  *cpu_load = counter_value.doubleValue / 100;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1103
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1104
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1105
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1106
int CPUPerformanceInterface::CPUPerformance::cpu_load_total_process(double* cpu_load) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1107
  *cpu_load = .0;
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1108
  if (_process_cpu_load == NULL || !_process_cpu_load->set.initialized) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1109
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1110
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1111
  assert(_process_cpu_load != NULL, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1112
  if (collect_process_query_data(_process_cpu_load)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1113
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1114
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1115
  PDH_FMT_COUNTERVALUE counter_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1116
  if (query_process_counter(_process_cpu_load, 0, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, &counter_value) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1117
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1118
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1119
  double process_load = counter_value.doubleValue / cpu_factor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1120
  process_load = MIN2<double>(1, process_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1121
  process_load = MAX2<double>(0, process_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1122
  *cpu_load = process_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1123
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1124
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1125
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1126
int CPUPerformanceInterface::CPUPerformance::cpu_loads_process(double* pjvmUserLoad,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1127
                                                               double* pjvmKernelLoad,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1128
                                                               double* psystemTotalLoad) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1129
  assert(pjvmUserLoad != NULL, "pjvmUserLoad is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1130
  assert(pjvmKernelLoad != NULL, "pjvmKernelLoad is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1131
  assert(psystemTotalLoad != NULL, "psystemTotalLoad is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1132
  *pjvmUserLoad = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1133
  *pjvmKernelLoad = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1134
  *psystemTotalLoad = .0;
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1135
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1136
  if (_process_cpu_load == NULL || !_process_cpu_load->set.initialized) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1137
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1138
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1139
  assert(_process_cpu_load != NULL, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1140
  if (collect_process_query_data(_process_cpu_load)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1141
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1142
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1143
  double process_load = .0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1144
  PDH_FMT_COUNTERVALUE counter_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1145
  // Read  PDH_PROCESSOR_TIME_IDX
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1146
  if (query_process_counter(_process_cpu_load, 0, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, &counter_value) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1147
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1148
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1149
  process_load = counter_value.doubleValue / cpu_factor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1150
  process_load = MIN2<double>(1, process_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1151
  process_load = MAX2<double>(0, process_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1152
  // Read PDH_PRIV_PROCESSOR_TIME_IDX
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1153
  if (query_process_counter(_process_cpu_load, 1, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, &counter_value) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1154
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1155
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1156
  double kernel_load = counter_value.doubleValue / cpu_factor();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1157
  kernel_load = MIN2<double>(1, kernel_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1158
  kernel_load = MAX2<double>(0, kernel_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1159
  *pjvmKernelLoad = kernel_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1160
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1161
  double user_load = process_load - kernel_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1162
  user_load = MIN2<double>(1, user_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1163
  user_load = MAX2<double>(0, user_load);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1164
  *pjvmUserLoad = user_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1165
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1166
  if (collect_query_data(_machine_cpu_load)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1167
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1168
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1169
  if (formatted_counter_value(_machine_cpu_load->counters[_machine_cpu_load->noOfCounters - 1], PDH_FMT_DOUBLE, &counter_value) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1170
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1171
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1172
  double machine_load = counter_value.doubleValue / 100;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1173
  assert(machine_load >= 0, "machine_load is negative!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1174
  // clamp at user+system and 1.0
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1175
  if (*pjvmKernelLoad + *pjvmUserLoad > machine_load) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1176
    machine_load = MIN2(*pjvmKernelLoad + *pjvmUserLoad, 1.0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1177
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1178
  *psystemTotalLoad = machine_load;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1179
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1180
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1181
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1182
int CPUPerformanceInterface::CPUPerformance::context_switch_rate(double* rate) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1183
  assert(rate != NULL, "invariant");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1184
  *rate = .0;
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1185
  if (_context_switches == NULL || !_context_switches->initialized) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1186
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1187
  }
50321
b186322970f4 8203321: assert(current_query_index < process_query_set->size) failed: invariant
mgronlun
parents: 50113
diff changeset
  1188
  assert(_context_switches != NULL, "invariant");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1189
  if (collect_query_data(_context_switches) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1190
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1191
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1192
  PDH_FMT_COUNTERVALUE counter_value;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1193
  if (formatted_counter_value(_context_switches->counter, PDH_FMT_DOUBLE, &counter_value) != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1194
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1195
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1196
  *rate = counter_value.doubleValue;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1197
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1198
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1200
SystemProcessInterface::SystemProcesses::ProcessIterator::ProcessIterator() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1201
  _hProcessSnap = INVALID_HANDLE_VALUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1202
  _valid = FALSE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1203
  _pe32.dwSize = sizeof(PROCESSENTRY32);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1204
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1206
bool SystemProcessInterface::SystemProcesses::ProcessIterator::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1207
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1208
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1209
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1210
int SystemProcessInterface::SystemProcesses::ProcessIterator::snapshot() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1211
  // take snapshot of all process in the system
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1212
  _hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1213
  if (_hProcessSnap == INVALID_HANDLE_VALUE) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1214
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1215
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1216
  // step to first process
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1217
  _valid = Process32First(_hProcessSnap, &_pe32);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1218
  return is_valid() ? OS_OK : OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1219
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1220
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1221
SystemProcessInterface::SystemProcesses::ProcessIterator::~ProcessIterator() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1222
  if (_hProcessSnap != INVALID_HANDLE_VALUE) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1223
    CloseHandle(_hProcessSnap);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1224
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1225
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1226
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1227
int SystemProcessInterface::SystemProcesses::ProcessIterator::current(SystemProcess* process_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1228
  assert(is_valid(), "no current process to be fetched!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1229
  assert(process_info != NULL, "process_info is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1230
  char* exePath = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1231
  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, _pe32.th32ProcessID);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1232
  if (hProcess != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1233
    HMODULE hMod;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1234
    DWORD cbNeeded;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1235
    if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded) != 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1236
      if (GetModuleFileNameExA(hProcess, hMod, _exePath, sizeof(_exePath)) != 0) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1237
        exePath = _exePath;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1238
      }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1239
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1240
    CloseHandle (hProcess);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1241
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1242
  process_info->set_pid((int)_pe32.th32ProcessID);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1243
  process_info->set_name(allocate_string(_pe32.szExeFile));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1244
  process_info->set_path(allocate_string(exePath));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1245
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1246
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1247
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1248
char* SystemProcessInterface::SystemProcesses::ProcessIterator::allocate_string(const char* str) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1249
  if (str != NULL) {
53882
ca682d9d8db5 8214777: Avoid some GCC 8.X strncpy() errors in HotSpot
mikael
parents: 50879
diff changeset
  1250
    return os::strdup_check_oom(str, mtInternal);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1251
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1252
  return NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1253
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1254
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1255
int SystemProcessInterface::SystemProcesses::ProcessIterator::next_process() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1256
  _valid = Process32Next(_hProcessSnap, &_pe32);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1257
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1258
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1259
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1260
SystemProcessInterface::SystemProcesses::SystemProcesses() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1261
  _iterator = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1262
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1263
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1264
bool SystemProcessInterface::SystemProcesses::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1265
  _iterator = new SystemProcessInterface::SystemProcesses::ProcessIterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1266
  return _iterator != NULL && _iterator->initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1267
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1268
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1269
SystemProcessInterface::SystemProcesses::~SystemProcesses() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1270
  if (_iterator != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1271
    delete _iterator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1272
    _iterator = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1273
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1274
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1275
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1276
int SystemProcessInterface::SystemProcesses::system_processes(SystemProcess** system_processes,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1277
                                                              int* no_of_sys_processes) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1278
  assert(system_processes != NULL, "system_processes pointer is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1279
  assert(no_of_sys_processes != NULL, "system_processes counter pointers is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1280
  assert(_iterator != NULL, "iterator is NULL!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1281
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1282
  // initialize pointers
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1283
  *no_of_sys_processes = 0;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1284
  *system_processes = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1285
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1286
  // take process snapshot
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1287
  if (_iterator->snapshot() != OS_OK) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1288
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1289
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1290
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1291
  while (_iterator->is_valid()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1292
    SystemProcess* tmp = new SystemProcess();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1293
    _iterator->current(tmp);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1294
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1295
    //if already existing head
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1296
    if (*system_processes != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1297
      //move "first to second"
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1298
      tmp->set_next(*system_processes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1299
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1300
    // new head
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1301
    *system_processes = tmp;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1302
    // increment
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1303
    (*no_of_sys_processes)++;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1304
    // step forward
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1305
    _iterator->next_process();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1306
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1307
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1308
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1309
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1310
int SystemProcessInterface::system_processes(SystemProcess** system_procs,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1311
                                             int* no_of_sys_processes) const {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1312
  return _impl->system_processes(system_procs, no_of_sys_processes);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1313
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1314
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1315
SystemProcessInterface::SystemProcessInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1316
  _impl = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1317
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1318
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1319
bool SystemProcessInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1320
  _impl = new SystemProcessInterface::SystemProcesses();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1321
  return _impl != NULL && _impl->initialize();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1322
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1323
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1324
SystemProcessInterface::~SystemProcessInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1325
  if (_impl != NULL) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1326
    delete _impl;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1327
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1328
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1329
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1330
CPUInformationInterface::CPUInformationInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1331
  _cpu_info = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1332
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1333
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1334
bool CPUInformationInterface::initialize() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1335
  _cpu_info = new CPUInformation();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1336
  if (NULL == _cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1337
    return false;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1338
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1339
  _cpu_info->set_number_of_hardware_threads(VM_Version_Ext::number_of_threads());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1340
  _cpu_info->set_number_of_cores(VM_Version_Ext::number_of_cores());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1341
  _cpu_info->set_number_of_sockets(VM_Version_Ext::number_of_sockets());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1342
  _cpu_info->set_cpu_name(VM_Version_Ext::cpu_name());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1343
  _cpu_info->set_cpu_description(VM_Version_Ext::cpu_description());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1344
  return true;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1345
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1346
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1347
CPUInformationInterface::~CPUInformationInterface() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1348
  if (_cpu_info != NULL) {
58084
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
  1349
    FREE_C_HEAP_ARRAY(char, _cpu_info->cpu_name());
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
  1350
    _cpu_info->set_cpu_name(NULL);
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
  1351
    FREE_C_HEAP_ARRAY(char, _cpu_info->cpu_description());
cddef3bde924 8230398: Remove NULL checks before FREE_C_HEAP_ARRAY
lkorinth
parents: 58083
diff changeset
  1352
    _cpu_info->set_cpu_description(NULL);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1353
    delete _cpu_info;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1354
    _cpu_info = NULL;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1355
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1356
}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1357
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1358
int CPUInformationInterface::cpu_information(CPUInformation& cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1359
  if (NULL == _cpu_info) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1360
    return OS_ERR;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1361
  }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1362
  cpu_info = *_cpu_info; // shallow copy assignment
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1363
  return OS_OK;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
  1364
}
50879
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1365
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1366
class NetworkPerformanceInterface::NetworkPerformance : public CHeapObj<mtInternal> {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1367
  friend class NetworkPerformanceInterface;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1368
 private:
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1369
  bool _iphlp_attached;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1370
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1371
  NetworkPerformance();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1372
  NetworkPerformance(const NetworkPerformance& rhs); // no impl
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1373
  NetworkPerformance& operator=(const NetworkPerformance& rhs); // no impl
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1374
  bool initialize();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1375
  ~NetworkPerformance();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1376
  int network_utilization(NetworkInterface** network_interfaces) const;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1377
};
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1378
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1379
NetworkPerformanceInterface::NetworkPerformance::NetworkPerformance()
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1380
: _iphlp_attached(false) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1381
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1382
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1383
bool NetworkPerformanceInterface::NetworkPerformance::initialize() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1384
  _iphlp_attached = IphlpDll::IphlpAttach();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1385
  return _iphlp_attached;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1386
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1387
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1388
NetworkPerformanceInterface::NetworkPerformance::~NetworkPerformance() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1389
  if (_iphlp_attached) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1390
    IphlpDll::IphlpDetach();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1391
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1392
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1393
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1394
int NetworkPerformanceInterface::NetworkPerformance::network_utilization(NetworkInterface** network_interfaces) const {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1395
  MIB_IF_TABLE2* table;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1396
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1397
  if (IphlpDll::GetIfTable2(&table) != NO_ERROR) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1398
    return OS_ERR;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1399
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1400
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1401
  NetworkInterface* ret = NULL;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1402
  for (ULONG i = 0; i < table->NumEntries; ++i) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1403
    if (table->Table[i].InterfaceAndOperStatusFlags.FilterInterface) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1404
      continue;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1405
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1406
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1407
    char buf[256];
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1408
    if (WideCharToMultiByte(CP_UTF8, 0, table->Table[i].Description, -1, buf, sizeof(buf), NULL, NULL) == 0) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1409
      continue;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1410
    }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1411
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1412
    NetworkInterface* cur = new NetworkInterface(buf, table->Table[i].InOctets, table->Table[i].OutOctets, ret);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1413
    ret = cur;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1414
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1415
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1416
  IphlpDll::FreeMibTable(table);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1417
  *network_interfaces = ret;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1418
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1419
  return OS_OK;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1420
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1421
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1422
NetworkPerformanceInterface::NetworkPerformanceInterface() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1423
  _impl = NULL;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1424
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1425
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1426
NetworkPerformanceInterface::~NetworkPerformanceInterface() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1427
  if (_impl != NULL) {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1428
    delete _impl;
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1429
  }
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1430
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1431
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1432
bool NetworkPerformanceInterface::initialize() {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1433
  _impl = new NetworkPerformanceInterface::NetworkPerformance();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1434
  return _impl != NULL && _impl->initialize();
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1435
}
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1436
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1437
int NetworkPerformanceInterface::network_utilization(NetworkInterface** network_interfaces) const {
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1438
  return _impl->network_utilization(network_interfaces);
d90c3cbf13df 8003209: JFR events for network utilization
rwestberg
parents: 50321
diff changeset
  1439
}