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