test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.c
author jcbeyler
Tue, 17 Jul 2018 19:59:38 -0700
changeset 51138 914f305ba6fa
parent 51136 6d6611346837
child 51175 65556ae796ad
permissions -rw-r--r--
8205725: Update the JVMTI Spec for Heap Sampling Summary: Update the JVMTI Spec for Heap Sampling Reviewed-by: amenkov, sspitsyn Contributed-by: jcbeyler@google.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     1
/*
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     2
 * Copyright (c) 2018, Google and/or its affiliates. All rights reserved.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     4
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     8
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    13
 * accompanied this code).
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    14
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    18
 *
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    21
 * questions.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    22
 */
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    23
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    24
#include <assert.h>
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    25
#include <stdio.h>
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    26
#include <stdlib.h>
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    27
#include <string.h>
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    28
#include "jvmti.h"
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    29
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    30
#ifdef __cplusplus
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    31
extern "C" {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    32
#endif
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    33
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    34
#ifndef JNI_ENV_ARG
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    35
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    36
#ifdef __cplusplus
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    37
#define JNI_ENV_ARG(x, y) y
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    38
#define JNI_ENV_PTR(x) x
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    39
#else
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    40
#define JNI_ENV_ARG(x,y) x, y
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    41
#define JNI_ENV_PTR(x) (*x)
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    42
#endif
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    43
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    44
#endif
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    45
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    46
#define TRUE 1
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    47
#define FALSE 0
51136
6d6611346837 8205541: serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorStatArrayCorrectnessTest.java fails with Should not have any events stored yet.
jcbeyler
parents: 51074
diff changeset
    48
#define PRINT_OUT 1
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    49
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    50
static jvmtiEnv *jvmti = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    51
static jvmtiEnv *second_jvmti = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    52
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    53
typedef struct _ObjectTrace{
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    54
  jweak object;
50638
f9f2e6a6a7b2 8205172: 32 bit build broken
mdoerr
parents: 50579
diff changeset
    55
  jlong size;
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    56
  jvmtiFrameInfo* frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    57
  size_t frame_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    58
  jthread thread;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    59
} ObjectTrace;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    60
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    61
typedef struct _EventStorage {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    62
  int live_object_additions;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    63
  int live_object_size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    64
  int live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    65
  ObjectTrace** live_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    66
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    67
  int garbage_history_size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    68
  int garbage_history_index;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    69
  ObjectTrace** garbage_collected_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    70
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    71
  // Two separate monitors to separate storage data race and the compaction field
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    72
  // data race.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    73
  jrawMonitorID storage_monitor;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    74
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    75
  int compaction_required;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    76
  jrawMonitorID compaction_monitor;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    77
} EventStorage;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    78
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    79
typedef struct _ExpectedContentFrame {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    80
  const char *name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    81
  const char *signature;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    82
  const char *file_name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    83
  int line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    84
} ExpectedContentFrame;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    85
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    86
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    87
void event_storage_lock(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    88
  (*jvmti)->RawMonitorEnter(jvmti, storage->storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    89
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    90
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    91
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    92
void event_storage_unlock(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    93
  (*jvmti)->RawMonitorExit(jvmti, storage->storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    94
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    95
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    96
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    97
void event_storage_lock_compaction(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    98
  (*jvmti)->RawMonitorEnter(jvmti, storage->compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    99
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   100
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   101
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   102
void event_storage_unlock_compaction(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   103
  (*jvmti)->RawMonitorExit(jvmti, storage->compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   104
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   105
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   106
// Given a method and a location, this method gets the line number.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   107
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   108
jint get_line_number(jvmtiEnv* jvmti, jmethodID method,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   109
                     jlocation location) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   110
  // Read the line number table.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   111
  jvmtiLineNumberEntry *table_ptr = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   112
  jint line_number_table_entries;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   113
  int l;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   114
  jlocation last_location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   115
  int jvmti_error = (*jvmti)->GetLineNumberTable(jvmti, method,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   116
                                                 &line_number_table_entries,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   117
                                                 &table_ptr);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   118
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   119
  if (JVMTI_ERROR_NONE != jvmti_error) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   120
    return -1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   121
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   122
  if (line_number_table_entries <= 0) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   123
    return -1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   124
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   125
  if (line_number_table_entries == 1) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   126
    return table_ptr[0].line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   127
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   128
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   129
  // Go through all the line numbers...
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   130
  last_location = table_ptr[0].start_location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   131
  for (l = 1; l < line_number_table_entries; l++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   132
    // ... and if you see one that is in the right place for your
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   133
    // location, you've found the line number!
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   134
    if ((location < table_ptr[l].start_location) &&
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   135
        (location >= last_location)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   136
      return table_ptr[l - 1].line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   137
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   138
    last_location = table_ptr[l].start_location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   139
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   140
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   141
  if (location >= last_location) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   142
    return table_ptr[line_number_table_entries - 1].line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   143
  } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   144
    return -1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   145
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   146
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   147
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   148
static void print_out_frames(JNIEnv* env, ObjectTrace* trace) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   149
  jvmtiFrameInfo* frames = trace->frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   150
  size_t i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   151
  for (i = 0; i < trace->frame_count; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   152
    // Get basic information out of the trace.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   153
    jlocation bci = frames[i].location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   154
    jmethodID methodid = frames[i].method;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   155
    char *name = NULL, *signature = NULL, *file_name = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   156
    jclass declaring_class;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   157
    int line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   158
    jvmtiError err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   159
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   160
    if (bci < 0) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   161
      fprintf(stderr, "\tNative frame\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   162
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   163
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   164
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   165
    // Transform into usable information.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   166
    line_number = get_line_number(jvmti, methodid, bci);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   167
    if (JVMTI_ERROR_NONE !=
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   168
        (*jvmti)->GetMethodName(jvmti, methodid, &name, &signature, 0)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   169
      fprintf(stderr, "\tUnknown method name\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   170
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   171
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   172
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   173
    if (JVMTI_ERROR_NONE !=
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   174
        (*jvmti)->GetMethodDeclaringClass(jvmti, methodid, &declaring_class)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   175
      fprintf(stderr, "\tUnknown class\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   176
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   177
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   178
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   179
    err = (*jvmti)->GetSourceFileName(jvmti, declaring_class,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   180
                                      &file_name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   181
    if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   182
      fprintf(stderr, "\tUnknown file\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   183
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   184
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   185
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   186
    // Compare now, none should be NULL.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   187
    if (name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   188
      fprintf(stderr, "\tUnknown name\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   189
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   190
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   191
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   192
    if (file_name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   193
      fprintf(stderr, "\tUnknown file\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   194
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   195
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   196
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   197
    if (signature == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   198
      fprintf(stderr, "\tUnknown signature\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   199
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   200
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   201
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   202
    fprintf(stderr, "\t%s%s (%s: %d)\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   203
            name, signature, file_name, line_number);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   204
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   205
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   206
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   207
static jboolean check_sample_content(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   208
                                     ObjectTrace* trace,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   209
                                     ExpectedContentFrame *expected,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   210
                                     size_t expected_count,
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   211
                                     jboolean check_lines,
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   212
                                     int print_out_comparisons) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   213
  jvmtiFrameInfo* frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   214
  size_t i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   215
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   216
  if (expected_count > trace->frame_count) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   217
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   218
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   219
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   220
  frames = trace->frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   221
  for (i = 0; i < expected_count; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   222
    // Get basic information out of the trace.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   223
    jlocation bci = frames[i].location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   224
    jmethodID methodid = frames[i].method;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   225
    char *name = NULL, *signature = NULL, *file_name = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   226
    jclass declaring_class;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   227
    int line_number;
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   228
    jboolean differ;
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   229
    jvmtiError err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   230
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   231
    if (bci < 0 && expected[i].line_number != -1) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   232
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   233
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   234
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   235
    // Transform into usable information.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   236
    line_number = get_line_number(jvmti, methodid, bci);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   237
    (*jvmti)->GetMethodName(jvmti, methodid, &name, &signature, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   238
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   239
    if (JVMTI_ERROR_NONE !=
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   240
        (*jvmti)->GetMethodDeclaringClass(jvmti, methodid, &declaring_class)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   241
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   242
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   243
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   244
    err = (*jvmti)->GetSourceFileName(jvmti, declaring_class,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   245
                                      &file_name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   246
    if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   247
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   248
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   249
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   250
    // Compare now, none should be NULL.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   251
    if (name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   252
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   253
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   254
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   255
    if (file_name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   256
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   257
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   258
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   259
    if (signature == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   260
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   261
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   262
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   263
    differ = (strcmp(name, expected[i].name) ||
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   264
              strcmp(signature, expected[i].signature) ||
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   265
              strcmp(file_name, expected[i].file_name) ||
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   266
              (check_lines && line_number != expected[i].line_number));
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   267
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   268
    if (print_out_comparisons) {
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   269
      fprintf(stderr, "\tComparing: (check_lines: %d)\n", check_lines);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   270
      fprintf(stderr, "\t\tNames: %s and %s\n", name, expected[i].name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   271
      fprintf(stderr, "\t\tSignatures: %s and %s\n", signature, expected[i].signature);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   272
      fprintf(stderr, "\t\tFile name: %s and %s\n", file_name, expected[i].file_name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   273
      fprintf(stderr, "\t\tLines: %d and %d\n", line_number, expected[i].line_number);
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   274
      fprintf(stderr, "\t\tResult is %d\n", differ);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   275
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   276
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   277
    if (differ) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   278
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   279
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   280
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   281
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   282
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   283
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   284
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   285
// Static native API for various tests.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   286
static void fill_native_frames(JNIEnv* env, jobjectArray frames,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   287
                               ExpectedContentFrame* native_frames, size_t size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   288
  size_t i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   289
  for (i = 0; i < size; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   290
    jobject obj = (*env)->GetObjectArrayElement(env, frames, (jsize) i);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   291
    jclass frame_class = (*env)->GetObjectClass(env, obj);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   292
    jfieldID line_number_field_id = (*env)->GetFieldID(env, frame_class,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   293
                                                       "lineNumber", "I");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   294
    int line_number = (*env)->GetIntField(env, obj, line_number_field_id);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   295
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   296
    jfieldID string_id = (*env)->GetFieldID(env, frame_class, "method",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   297
                                            "Ljava/lang/String;");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   298
    jstring string_object = (jstring) (*env)->GetObjectField(env, obj,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   299
                                                             string_id);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   300
    const char* method = (*env)->GetStringUTFChars(env, string_object, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   301
    const char* file_name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   302
    const char* signature;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   303
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   304
    string_id = (*env)->GetFieldID(env, frame_class, "fileName",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   305
                                   "Ljava/lang/String;");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   306
    string_object = (jstring) (*env)->GetObjectField(env, obj, string_id);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   307
    file_name = (*env)->GetStringUTFChars(env, string_object, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   308
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   309
    string_id = (*env)->GetFieldID(env, frame_class, "signature",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   310
                                   "Ljava/lang/String;");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   311
    string_object = (jstring) (*env)->GetObjectField(env, obj, string_id);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   312
    signature= (*env)->GetStringUTFChars(env, string_object, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   313
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   314
    native_frames[i].name = method;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   315
    native_frames[i].file_name = file_name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   316
    native_frames[i].signature = signature;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   317
    native_frames[i].line_number = line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   318
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   319
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   320
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   321
// Internal storage system implementation.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   322
static EventStorage global_event_storage;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   323
static EventStorage second_global_event_storage;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   324
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   325
static void event_storage_set_compaction_required(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   326
  event_storage_lock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   327
  storage->compaction_required = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   328
  event_storage_unlock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   329
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   330
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   331
static int event_storage_get_compaction_required(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   332
  int result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   333
  event_storage_lock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   334
  result = storage->compaction_required;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   335
  event_storage_unlock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   336
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   337
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   338
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   339
static void event_storage_set_garbage_history(EventStorage* storage, int value) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   340
  size_t size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   341
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   342
  global_event_storage.garbage_history_size = value;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   343
  free(global_event_storage.garbage_collected_objects);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   344
  size = sizeof(*global_event_storage.garbage_collected_objects) * value;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   345
  global_event_storage.garbage_collected_objects = malloc(size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   346
  memset(global_event_storage.garbage_collected_objects, 0, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   347
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   348
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   349
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   350
// No mutex here, it is handled by the caller.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   351
static void event_storage_add_garbage_collected_object(EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   352
                                                       ObjectTrace* object) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   353
  int idx = storage->garbage_history_index;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   354
  ObjectTrace* old_object = storage->garbage_collected_objects[idx];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   355
  if (old_object != NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   356
    free(old_object->frames);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   357
    free(storage->garbage_collected_objects[idx]);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   358
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   359
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   360
  storage->garbage_collected_objects[idx] = object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   361
  storage->garbage_history_index = (idx + 1) % storage->garbage_history_size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   362
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   363
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   364
static int event_storage_get_count(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   365
  int result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   366
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   367
  result = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   368
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   369
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   370
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   371
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   372
static double event_storage_get_average_interval(EventStorage* storage) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   373
  double accumulation = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   374
  int max_size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   375
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   376
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   377
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   378
  max_size = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   379
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   380
  for (i = 0; i < max_size; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   381
    accumulation += storage->live_objects[i]->size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   382
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   383
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   384
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   385
  return accumulation / max_size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   386
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   387
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   388
static jboolean event_storage_contains(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   389
                                       EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   390
                                       ExpectedContentFrame* frames,
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   391
                                       size_t size,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   392
                                       jboolean check_lines) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   393
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   394
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   395
  fprintf(stderr, "Checking storage count %d\n", storage->live_object_count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   396
  for (i = 0; i < storage->live_object_count; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   397
    ObjectTrace* trace = storage->live_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   398
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   399
    if (check_sample_content(env, trace, frames, size, check_lines, PRINT_OUT)) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   400
      event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   401
      return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   402
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   403
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   404
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   405
  return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   406
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   407
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   408
static jboolean event_storage_garbage_contains(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   409
                                               EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   410
                                               ExpectedContentFrame* frames,
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   411
                                               size_t size,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   412
                                               jboolean check_lines) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   413
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   414
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   415
  fprintf(stderr, "Checking garbage storage count %d\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   416
          storage->garbage_history_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   417
  for (i = 0; i < storage->garbage_history_size; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   418
    ObjectTrace* trace = storage->garbage_collected_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   419
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   420
    if (trace == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   421
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   422
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   423
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   424
    if (check_sample_content(env, trace, frames, size, check_lines, PRINT_OUT)) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   425
      event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   426
      return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   427
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   428
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   429
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   430
  return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   431
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   432
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   433
// No mutex here, handled by the caller.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   434
static void event_storage_augment_storage(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   435
  int new_max = (storage->live_object_size * 2) + 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   436
  ObjectTrace** new_objects = malloc(new_max * sizeof(*new_objects));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   437
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   438
  int current_count = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   439
  memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   440
  free(storage->live_objects);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   441
  storage->live_objects = new_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   442
  storage->live_object_size = new_max;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   443
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   444
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   445
static void event_storage_add(EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   446
                              JNIEnv* jni,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   447
                              jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   448
                              jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   449
                              jclass klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   450
                              jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   451
  jvmtiFrameInfo frames[64];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   452
  jint count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   453
  jvmtiError err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   454
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   455
  err = (*jvmti)->GetStackTrace(jvmti, thread, 0, 64, frames, &count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   456
  if (err == JVMTI_ERROR_NONE && count >= 1) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   457
    ObjectTrace* live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   458
    jvmtiFrameInfo* allocated_frames = (jvmtiFrameInfo*) malloc(count * sizeof(*allocated_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   459
    memcpy(allocated_frames, frames, count * sizeof(*allocated_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   460
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   461
    live_object = (ObjectTrace*) malloc(sizeof(*live_object));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   462
    live_object->frames = allocated_frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   463
    live_object->frame_count = count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   464
    live_object->size = size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   465
    live_object->thread = thread;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   466
    live_object->object = (*jni)->NewWeakGlobalRef(jni, object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   467
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   468
    // Only now lock and get things done quickly.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   469
    event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   470
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   471
    storage->live_object_additions++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   472
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   473
    if (storage->live_object_count >= storage->live_object_size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   474
      event_storage_augment_storage(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   475
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   476
    assert(storage->live_object_count < storage->live_object_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   477
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   478
    if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   479
      fprintf(stderr, "Adding trace for thread %p, frame_count %d, storage %p\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   480
              thread, count, storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   481
      print_out_frames(jni, live_object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   482
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   483
    storage->live_objects[storage->live_object_count] = live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   484
    storage->live_object_count++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   485
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   486
    event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   487
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   488
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   489
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   490
static void event_storage_compact(EventStorage* storage, JNIEnv* jni) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   491
  int max, i, dest;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   492
  ObjectTrace** live_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   493
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   494
  event_storage_lock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   495
  storage->compaction_required = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   496
  event_storage_unlock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   497
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   498
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   499
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   500
  max = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   501
  live_objects = storage->live_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   502
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   503
  for (i = 0, dest = 0; i < max; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   504
    ObjectTrace* live_object = live_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   505
    jweak object = live_object->object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   506
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   507
    if (!(*jni)->IsSameObject(jni, object, NULL)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   508
      if (dest != i) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   509
        live_objects[dest] = live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   510
        dest++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   511
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   512
    } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   513
      (*jni)->DeleteWeakGlobalRef(jni, object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   514
      live_object->object = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   515
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   516
      event_storage_add_garbage_collected_object(storage, live_object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   517
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   518
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   519
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   520
  storage->live_object_count = dest;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   521
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   522
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   523
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   524
static void event_storage_free_objects(ObjectTrace** array, int max) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   525
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   526
  for (i = 0; i < max; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   527
    free(array[i]), array[i] = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   528
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   529
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   530
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   531
static void event_storage_reset(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   532
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   533
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   534
  // Reset everything except the mutex and the garbage collection.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   535
  event_storage_free_objects(storage->live_objects,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   536
                             storage->live_object_count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   537
  storage->live_object_additions = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   538
  storage->live_object_size = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   539
  storage->live_object_count = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   540
  free(storage->live_objects), storage->live_objects = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   541
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   542
  event_storage_free_objects(storage->garbage_collected_objects,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   543
                             storage->garbage_history_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   544
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   545
  storage->compaction_required = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   546
  storage->garbage_history_index = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   547
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   548
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   549
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   550
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   551
static int event_storage_number_additions(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   552
  int result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   553
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   554
  result = storage->live_object_additions;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   555
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   556
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   557
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   558
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   559
// Start of the JVMTI agent code.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   560
static const char *EXC_CNAME = "java/lang/Exception";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   561
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   562
static int check_error(jvmtiError err, const char *s) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   563
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   564
    printf("  ## %s error: %d\n", s, err);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   565
    return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   566
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   567
  return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   568
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   569
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   570
static int check_capability_error(jvmtiError err, const char *s) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   571
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   572
    if (err == JVMTI_ERROR_MUST_POSSESS_CAPABILITY) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   573
      return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   574
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   575
    fprintf(stderr, "  ## %s error: %d\n", s, err);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   576
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   577
  return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   578
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   580
static jint throw_exception(JNIEnv *env, char *msg) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   581
  jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   582
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   583
  if (exc_class == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   584
    fprintf(stderr, "throw_exception: Error in FindClass(env, %s)\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   585
            EXC_CNAME);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   586
    return -1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   587
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   588
  return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   589
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   590
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   591
static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   592
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   593
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   594
jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   595
  return Agent_Initialize(jvm, options, reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   596
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   597
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   598
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   599
jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   600
  return Agent_Initialize(jvm, options, reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   601
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   602
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   603
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   604
jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   605
  return JNI_VERSION_1_8;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   606
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   607
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   608
#define MAX_THREADS 500
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   609
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   610
typedef struct ThreadStats {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   611
  int number_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   612
  int counts[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   613
  int not_helper_counts[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   614
  int index[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   615
  jthread threads[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   616
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   617
  int method_resolution_problem;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   618
} ThreadStats;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   619
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   620
static ThreadStats thread_stats;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   621
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   622
static void add_thread_count(jthread thread, int lock, int helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   623
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   624
  jvmtiThreadInfo info;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   625
  const char* name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   626
  char* end;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   627
  int idx;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   628
  int err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   629
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   630
  if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   631
    event_storage_lock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   632
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   633
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   634
  for (i = 0; i < thread_stats.number_threads; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   635
    if (thread_stats.threads[i] == thread) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   636
      if (helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   637
        thread_stats.counts[i]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   638
      } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   639
        thread_stats.not_helper_counts[i]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   640
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   641
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   642
      if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   643
        event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   644
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   645
      return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   646
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   647
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   648
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   649
  thread_stats.threads[thread_stats.number_threads] = thread;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   650
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   651
  err = (*jvmti)->GetThreadInfo(jvmti, thread, &info);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   652
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   653
    if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   654
      event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   655
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   656
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   657
    // Just to have it accounted as an error...
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   658
    info.name = "Allocator99";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   659
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   660
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   661
  if (!strstr(info.name, "Allocator")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   662
    if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   663
      event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   664
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   665
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   666
    // Just to have it accounted as an error...
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   667
    info.name = "Allocator98";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   668
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   669
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   670
  name = info.name + 9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   671
  end = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   672
  idx = strtol(name, &end, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   673
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   674
  if (*end == '\0') {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   675
    if (helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   676
      thread_stats.counts[thread_stats.number_threads]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   677
    } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   678
      thread_stats.not_helper_counts[thread_stats.number_threads]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   679
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   680
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   681
    thread_stats.index[thread_stats.number_threads] = idx;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   682
    thread_stats.number_threads++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   683
  } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   684
    fprintf(stderr, "Problem with thread name...: %p %s\n", thread, name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   685
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   686
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   687
  if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   688
    fprintf(stderr, "Added %s - %p - %d - lock: %d\n", info.name, thread, idx, lock);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   689
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   690
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   691
  if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   692
    event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   693
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   694
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   695
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   696
static void print_thread_stats() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   697
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   698
  event_storage_lock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   699
  fprintf(stderr, "Method resolution problem: %d\n", thread_stats.method_resolution_problem);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   700
  fprintf(stderr, "Thread count:\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   701
  for (i = 0; i < thread_stats.number_threads; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   702
    fprintf(stderr, "\t%p: %d: %d - %d\n", thread_stats.threads[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   703
            thread_stats.index[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   704
            thread_stats.counts[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   705
            thread_stats.not_helper_counts[i]);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   706
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   707
  event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   708
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   709
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   710
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   711
void JNICALL SampledObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   712
                                JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   713
                                jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   714
                                jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   715
                                jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   716
                                jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   717
  add_thread_count(thread, 1, 1);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   718
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   719
  if (event_storage_get_compaction_required(&global_event_storage)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   720
    event_storage_compact(&global_event_storage, jni_env);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   721
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   722
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   723
  event_storage_add(&global_event_storage, jni_env, thread, object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   724
                    object_klass, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   725
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   726
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   727
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   728
void JNICALL VMObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   729
                           JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   730
                           jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   731
                           jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   732
                           jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   733
                           jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   734
  event_storage_add(&second_global_event_storage, jni_env, thread, object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   735
                    object_klass, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   736
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   737
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   738
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   739
void JNICALL GarbageCollectionFinish(jvmtiEnv *jvmti_env) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   740
  event_storage_set_compaction_required(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   741
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   742
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   743
static int enable_notifications() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   744
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   745
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   746
                     "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   747
    return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   748
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   749
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   750
  return check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   751
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   752
                     "Set event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   753
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   754
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   755
static int enable_notifications_for_two_threads(jthread first, jthread second) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   756
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   757
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   758
                           "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   759
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   760
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   761
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   762
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   763
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, first),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   764
                  "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   765
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   766
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   767
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   768
  // Second thread should fail.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   769
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   770
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, second),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   771
                  "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   772
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   773
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   774
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   775
  return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   776
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   777
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   778
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   779
jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   780
  jint res;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   781
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   782
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   783
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   784
  res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   785
                                 JVMTI_VERSION_9);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   786
  if (res != JNI_OK || jvmti == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   787
    fprintf(stderr, "Error: wrong result of a valid call to GetEnv!\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   788
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   789
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   790
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   791
  // Get second jvmti environment.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   792
  res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &second_jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   793
                                 JVMTI_VERSION_9);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   794
  if (res != JNI_OK || second_jvmti == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   795
    fprintf(stderr, "Error: wrong result of a valid second call to GetEnv!\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   796
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   797
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   798
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   799
  if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   800
    fprintf(stderr, "Storage is at %p, secondary is at %p\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   801
            &global_event_storage, &second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   802
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   803
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   804
  (*jvmti)->CreateRawMonitor(jvmti, "storage_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   805
                             &global_event_storage.storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   806
  (*jvmti)->CreateRawMonitor(jvmti, "second_storage_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   807
                             &second_global_event_storage.storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   808
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   809
  (*jvmti)->CreateRawMonitor(jvmti, "compaction_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   810
                             &global_event_storage.compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   811
  (*jvmti)->CreateRawMonitor(jvmti, "second_compaction_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   812
                             &second_global_event_storage.compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   813
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   814
  event_storage_set_garbage_history(&global_event_storage, 200);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   815
  event_storage_set_garbage_history(&second_global_event_storage, 200);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   816
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   817
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   818
  callbacks.SampledObjectAlloc = &SampledObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   819
  callbacks.VMObjectAlloc = &VMObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   820
  callbacks.GarbageCollectionFinish = &GarbageCollectionFinish;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   821
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   822
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   823
  // Get line numbers, sample events, filename, and gc events for the tests.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   824
  caps.can_get_line_numbers = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   825
  caps.can_get_source_file_name = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   826
  caps.can_generate_garbage_collection_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   827
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   828
  caps.can_generate_vm_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   829
  if (check_error((*jvmti)->AddCapabilities(jvmti, &caps), "Add capabilities")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   830
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   831
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   832
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   833
  if (check_error((*jvmti)->SetEventCallbacks(jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   834
                                              sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   835
                  " Set Event Callbacks")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   836
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   837
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   838
  return JNI_OK;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   839
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   840
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   841
JNIEXPORT void JNICALL
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   842
Java_MyPackage_HeapMonitor_setSamplingInterval(JNIEnv* env, jclass cls, jint value) {
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   843
  (*jvmti)->SetHeapSamplingInterval(jvmti, value);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   844
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   845
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   846
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   847
Java_MyPackage_HeapMonitor_eventStorageIsEmpty(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   848
  return event_storage_get_count(&global_event_storage) == 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   849
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   850
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   851
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   852
Java_MyPackage_HeapMonitor_getEventStorageElementCount(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   853
  return event_storage_get_count(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   854
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   855
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   856
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   857
Java_MyPackage_HeapMonitor_enableSamplingEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   858
  enable_notifications();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   859
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   860
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   861
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   862
Java_MyPackage_HeapMonitor_enableSamplingEventsForTwoThreads(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   863
                                                             jclass cls,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   864
                                                             jthread first,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   865
                                                             jthread second) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   866
  return enable_notifications_for_two_threads(first, second);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   867
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   868
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   869
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   870
Java_MyPackage_HeapMonitor_disableSamplingEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   871
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   872
      jvmti, JVMTI_DISABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   873
              "Set event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   874
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   875
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   876
      jvmti, JVMTI_DISABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   877
              "Garbage Collection Finish");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   878
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   879
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   880
JNIEXPORT jboolean JNICALL
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   881
Java_MyPackage_HeapMonitor_obtainedEvents(JNIEnv* env, jclass cls,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   882
                                          jobjectArray frames,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   883
                                          jboolean check_lines) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   884
  jboolean result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   885
  jsize size = (*env)->GetArrayLength(env, frames);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   886
  ExpectedContentFrame *native_frames = malloc(size * sizeof(*native_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   887
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   888
  if (native_frames == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   889
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   890
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   891
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   892
  fill_native_frames(env, frames, native_frames, size);
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   893
  result = event_storage_contains(env, &global_event_storage, native_frames,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   894
                                  size, check_lines);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   895
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   896
  free(native_frames), native_frames = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   897
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   898
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   899
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   900
JNIEXPORT jboolean JNICALL
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   901
Java_MyPackage_HeapMonitor_garbageContains(JNIEnv* env, jclass cls,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   902
                                           jobjectArray frames,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   903
                                           jboolean check_lines) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   904
  jboolean result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   905
  jsize size = (*env)->GetArrayLength(env, frames);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   906
  ExpectedContentFrame *native_frames = malloc(size * sizeof(*native_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   907
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   908
  if (native_frames == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   909
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   910
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   911
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   912
  fill_native_frames(env, frames, native_frames, size);
51074
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   913
  result = event_storage_garbage_contains(env, &global_event_storage,
bf686c47c109 8206960: HeapMonitor tests fail with Graal
jcbeyler
parents: 50638
diff changeset
   914
                                          native_frames, size, check_lines);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   915
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   916
  free(native_frames), native_frames = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   917
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   918
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   919
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   920
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   921
Java_MyPackage_HeapMonitor_forceGarbageCollection(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   922
  check_error((*jvmti)->ForceGarbageCollection(jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   923
              "Forced Garbage Collection");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   924
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   925
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   926
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   927
Java_MyPackage_HeapMonitor_resetEventStorage(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   928
  event_storage_reset(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   929
  event_storage_reset(&second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   930
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   931
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   932
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   933
Java_MyPackage_HeapMonitorNoCapabilityTest_allSamplingMethodsFail(JNIEnv *env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   934
                                                                  jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   935
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   936
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   937
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   938
  if (check_error((*jvmti)->RelinquishCapabilities(jvmti, &caps),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   939
                  "Add capabilities\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   940
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   941
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   942
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   943
  if (check_capability_error((*jvmti)->SetHeapSamplingInterval(jvmti, 1<<19),
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   944
                             "Set Heap Sampling Interval")) {
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   945
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   946
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   947
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   948
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   949
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   950
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   951
Java_MyPackage_HeapMonitorIllegalArgumentTest_testIllegalArgument(JNIEnv *env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   952
                                                                  jclass cls) {
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   953
  if (check_error((*jvmti)->SetHeapSamplingInterval(jvmti, 0),
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   954
                  "Sampling interval 0 failed\n")){
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   955
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   956
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   957
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   958
  if (check_error((*jvmti)->SetHeapSamplingInterval(jvmti, 1024),
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   959
                  "Sampling interval 1024 failed\n")){
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   960
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   961
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   962
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   963
  if (!check_error((*jvmti)->SetHeapSamplingInterval(jvmti, -1),
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   964
                   "Sampling interval -1 passed\n")){
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   965
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   966
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   967
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   968
  if (!check_error((*jvmti)->SetHeapSamplingInterval(jvmti, -1024),
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   969
                   "Sampling interval -1024 passed\n")){
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   970
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   971
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   972
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   973
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   974
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   975
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   976
JNIEXPORT jdouble JNICALL
51138
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   977
Java_MyPackage_HeapMonitorStatIntervalTest_getAverageInterval(JNIEnv *env, jclass cls) {
914f305ba6fa 8205725: Update the JVMTI Spec for Heap Sampling
jcbeyler
parents: 51136
diff changeset
   978
  return event_storage_get_average_interval(&global_event_storage);
50579
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   979
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   980
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   981
typedef struct sThreadsFound {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   982
  jthread* threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   983
  int num_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   984
} ThreadsFound;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   985
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   986
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   987
Java_MyPackage_HeapMonitorThreadTest_checkSamples(JNIEnv* env, jclass cls,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   988
                                                  jint num_threads) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   989
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   990
  print_thread_stats();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   991
  // Ensure we got stacks from at least num_threads.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   992
  return thread_stats.number_threads >= num_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   993
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   994
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   995
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   996
void JNICALL SampledObjectAlloc2(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   997
                                 JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   998
                                 jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   999
                                 jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1000
                                 jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1001
                                 jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1002
  // Nop for now, two agents are not yet implemented.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1003
  assert(0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1004
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1005
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1006
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1007
Java_MyPackage_HeapMonitorTwoAgentsTest_enablingSamplingInSecondaryAgent(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1008
    JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1009
  // Currently this method should be failing directly at the AddCapability step
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1010
  // but the implementation is correct for when multi-agent support is enabled.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1011
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1012
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1013
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1014
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1015
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1016
  if (check_error((*second_jvmti)->AddCapabilities(second_jvmti, &caps),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1017
                  "Set the capability for second agent")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1018
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1019
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1020
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1021
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1022
  callbacks.SampledObjectAlloc = &SampledObjectAlloc2;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1023
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1024
  if (check_error((*second_jvmti)->SetEventCallbacks(second_jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1025
                                                     sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1026
                  " Set Event Callbacks for second agent")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1027
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1028
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1029
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1030
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1031
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1032
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1033
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1034
Java_MyPackage_HeapMonitor_enableVMEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1035
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1036
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1037
              "Set vm event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1038
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1039
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1040
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1041
Java_MyPackage_HeapMonitorVMEventsTest_vmEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1042
  return event_storage_number_additions(&second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1043
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1044
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1045
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1046
Java_MyPackage_HeapMonitor_sampledEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1047
  return event_storage_number_additions(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1048
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1049
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1050
static void allocate_object(JNIEnv* env) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1051
  // Construct an Object.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1052
  jclass cls = (*env)->FindClass(env, "java/lang/Object");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1053
  jmethodID constructor;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1054
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1055
  if (cls == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1056
    throw_exception(env, "Cannot find Object class.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1057
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1058
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1059
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1060
  constructor = (*env)->GetMethodID(env, cls, "<init>", "()V");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1061
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1062
  if (constructor == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1063
    throw_exception(env, "Cannot find Object class constructor.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1064
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1065
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1066
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1067
  // Call back constructor to allocate a new instance, with an int argument
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1068
  (*env)->NewObject(env, cls, constructor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1069
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1070
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1071
// Ensure we got a callback for the test.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1072
static int did_recursive_callback_test;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1073
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1074
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1075
void JNICALL RecursiveSampledObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1076
                                         JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1077
                                         jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1078
                                         jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1079
                                         jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1080
                                         jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1081
  // Basically ensure that if we were to allocate objects, we would not have an
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1082
  // infinite recursion here.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1083
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1084
  for (i = 0; i < 1000; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1085
    allocate_object(jni_env);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1086
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1087
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1088
  did_recursive_callback_test = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1089
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1090
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1091
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1092
Java_MyPackage_HeapMonitorRecursiveTest_didCallback(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1093
  return did_recursive_callback_test != 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1094
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1095
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1096
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1097
Java_MyPackage_HeapMonitorRecursiveTest_setCallbackToCallAllocateSomeMore(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1098
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1099
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1100
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1101
  callbacks.SampledObjectAlloc = &RecursiveSampledObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1102
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1103
  if (check_error((*jvmti)->SetEventCallbacks(jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1104
                                              sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1105
                  " Set Event Callbacks")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1106
    throw_exception(env, "Cannot reset the callback.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1107
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1108
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1109
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1110
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1111
#ifdef __cplusplus
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1112
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1113
#endif