test/hotspot/jtreg/serviceability/jvmti/HeapMonitor/libHeapMonitorTest.c
author mdoerr
Tue, 19 Jun 2018 16:29:48 +0200
changeset 50638 f9f2e6a6a7b2
parent 50579 1596f418ffe4
child 51074 bf686c47c109
permissions -rw-r--r--
8205172: 32 bit build broken Reviewed-by: roland, kvn, dholmes
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
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
    48
#define PRINT_OUT 0
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,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   211
                                     int print_out_comparisons) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   212
  jvmtiFrameInfo* frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   213
  size_t i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   214
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   215
  if (expected_count > trace->frame_count) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   216
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   217
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   218
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   219
  frames = trace->frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   220
  for (i = 0; i < expected_count; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   221
    // Get basic information out of the trace.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   222
    jlocation bci = frames[i].location;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   223
    jmethodID methodid = frames[i].method;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   224
    char *name = NULL, *signature = NULL, *file_name = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   225
    jclass declaring_class;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   226
    int line_number;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   227
    jvmtiError err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   228
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   229
    if (bci < 0 && expected[i].line_number != -1) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   230
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   231
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   232
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   233
    // Transform into usable information.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   234
    line_number = get_line_number(jvmti, methodid, bci);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   235
    (*jvmti)->GetMethodName(jvmti, methodid, &name, &signature, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   236
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   237
    if (JVMTI_ERROR_NONE !=
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   238
        (*jvmti)->GetMethodDeclaringClass(jvmti, methodid, &declaring_class)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   239
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   240
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   241
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   242
    err = (*jvmti)->GetSourceFileName(jvmti, declaring_class,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   243
                                      &file_name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   244
    if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   245
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   246
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   247
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   248
    // Compare now, none should be NULL.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   249
    if (name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   250
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   251
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   252
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   253
    if (file_name == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   254
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   255
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   256
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   257
    if (signature == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   258
      return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   259
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   260
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   261
    if (print_out_comparisons) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   262
      fprintf(stderr, "\tComparing:\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   263
      fprintf(stderr, "\t\tNames: %s and %s\n", name, expected[i].name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   264
      fprintf(stderr, "\t\tSignatures: %s and %s\n", signature, expected[i].signature);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   265
      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
   266
      fprintf(stderr, "\t\tLines: %d and %d\n", line_number, expected[i].line_number);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   267
      fprintf(stderr, "\t\tResult is %d\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   268
              (strcmp(name, expected[i].name) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   269
               strcmp(signature, expected[i].signature) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   270
               strcmp(file_name, expected[i].file_name) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   271
               line_number != expected[i].line_number));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   272
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   273
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   274
    if (strcmp(name, expected[i].name) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   275
        strcmp(signature, expected[i].signature) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   276
        strcmp(file_name, expected[i].file_name) ||
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   277
        line_number != expected[i].line_number) {
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
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   372
static double event_storage_get_average_rate(EventStorage* storage) {
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,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   391
                                       size_t size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   392
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   393
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   394
  fprintf(stderr, "Checking storage count %d\n", storage->live_object_count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   395
  for (i = 0; i < storage->live_object_count; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   396
    ObjectTrace* trace = storage->live_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   397
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   398
    if (check_sample_content(env, trace, frames, size, PRINT_OUT)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   399
      event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   400
      return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   401
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   402
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   403
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   404
  return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   405
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   406
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   407
static jboolean event_storage_garbage_contains(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   408
                                               EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   409
                                               ExpectedContentFrame* frames,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   410
                                               size_t size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   411
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   412
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   413
  fprintf(stderr, "Checking garbage storage count %d\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   414
          storage->garbage_history_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   415
  for (i = 0; i < storage->garbage_history_size; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   416
    ObjectTrace* trace = storage->garbage_collected_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   417
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   418
    if (trace == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   419
      continue;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   420
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   421
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   422
    if (check_sample_content(env, trace, frames, size, PRINT_OUT)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   423
      event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   424
      return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   425
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   426
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   427
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   428
  return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   429
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   430
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   431
// No mutex here, handled by the caller.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   432
static void event_storage_augment_storage(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   433
  int new_max = (storage->live_object_size * 2) + 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   434
  ObjectTrace** new_objects = malloc(new_max * sizeof(*new_objects));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   435
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   436
  int current_count = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   437
  memcpy(new_objects, storage->live_objects, current_count * sizeof(*new_objects));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   438
  free(storage->live_objects);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   439
  storage->live_objects = new_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   440
  storage->live_object_size = new_max;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   441
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   442
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   443
static void event_storage_add(EventStorage* storage,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   444
                              JNIEnv* jni,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   445
                              jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   446
                              jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   447
                              jclass klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   448
                              jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   449
  jvmtiFrameInfo frames[64];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   450
  jint count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   451
  jvmtiError err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   452
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   453
  err = (*jvmti)->GetStackTrace(jvmti, thread, 0, 64, frames, &count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   454
  if (err == JVMTI_ERROR_NONE && count >= 1) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   455
    ObjectTrace* live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   456
    jvmtiFrameInfo* allocated_frames = (jvmtiFrameInfo*) malloc(count * sizeof(*allocated_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   457
    memcpy(allocated_frames, frames, count * sizeof(*allocated_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   458
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   459
    live_object = (ObjectTrace*) malloc(sizeof(*live_object));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   460
    live_object->frames = allocated_frames;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   461
    live_object->frame_count = count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   462
    live_object->size = size;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   463
    live_object->thread = thread;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   464
    live_object->object = (*jni)->NewWeakGlobalRef(jni, object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   465
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   466
    // Only now lock and get things done quickly.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   467
    event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   468
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   469
    storage->live_object_additions++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   470
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   471
    if (storage->live_object_count >= storage->live_object_size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   472
      event_storage_augment_storage(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   473
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   474
    assert(storage->live_object_count < storage->live_object_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   475
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   476
    if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   477
      fprintf(stderr, "Adding trace for thread %p, frame_count %d, storage %p\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   478
              thread, count, storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   479
      print_out_frames(jni, live_object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   480
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   481
    storage->live_objects[storage->live_object_count] = live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   482
    storage->live_object_count++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   483
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   484
    event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   485
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   486
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   487
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   488
static void event_storage_compact(EventStorage* storage, JNIEnv* jni) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   489
  int max, i, dest;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   490
  ObjectTrace** live_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   491
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   492
  event_storage_lock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   493
  storage->compaction_required = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   494
  event_storage_unlock_compaction(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   495
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   496
  event_storage_lock(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
  max = storage->live_object_count;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   499
  live_objects = storage->live_objects;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   500
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   501
  for (i = 0, dest = 0; i < max; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   502
    ObjectTrace* live_object = live_objects[i];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   503
    jweak object = live_object->object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   504
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   505
    if (!(*jni)->IsSameObject(jni, object, NULL)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   506
      if (dest != i) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   507
        live_objects[dest] = live_object;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   508
        dest++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   509
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   510
    } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   511
      (*jni)->DeleteWeakGlobalRef(jni, object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   512
      live_object->object = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   513
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   514
      event_storage_add_garbage_collected_object(storage, live_object);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   515
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   516
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   517
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   518
  storage->live_object_count = dest;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   519
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   520
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   521
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   522
static void event_storage_free_objects(ObjectTrace** array, int max) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   523
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   524
  for (i = 0; i < max; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   525
    free(array[i]), array[i] = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   526
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   527
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   528
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   529
static void event_storage_reset(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   530
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   531
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   532
  // Reset everything except the mutex and the garbage collection.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   533
  event_storage_free_objects(storage->live_objects,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   534
                             storage->live_object_count);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   535
  storage->live_object_additions = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   536
  storage->live_object_size = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   537
  storage->live_object_count = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   538
  free(storage->live_objects), storage->live_objects = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   539
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   540
  event_storage_free_objects(storage->garbage_collected_objects,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   541
                             storage->garbage_history_size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   542
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   543
  storage->compaction_required = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   544
  storage->garbage_history_index = 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   545
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   546
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   547
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   548
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   549
static int event_storage_number_additions(EventStorage* storage) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   550
  int result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   551
  event_storage_lock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   552
  result = storage->live_object_additions;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   553
  event_storage_unlock(storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   554
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   555
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   556
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   557
// Start of the JVMTI agent code.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   558
static const char *EXC_CNAME = "java/lang/Exception";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   559
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   560
static int check_error(jvmtiError err, const char *s) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   561
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   562
    printf("  ## %s error: %d\n", s, err);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   563
    return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   564
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   565
  return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   566
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   567
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   568
static int check_capability_error(jvmtiError err, const char *s) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   569
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   570
    if (err == JVMTI_ERROR_MUST_POSSESS_CAPABILITY) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   571
      return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   572
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   573
    fprintf(stderr, "  ## %s error: %d\n", s, err);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   574
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   575
  return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   576
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   577
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   578
static jint throw_exception(JNIEnv *env, char *msg) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   579
  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
   580
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   581
  if (exc_class == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   582
    fprintf(stderr, "throw_exception: Error in FindClass(env, %s)\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   583
            EXC_CNAME);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   584
    return -1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   585
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   586
  return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   587
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   588
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   589
static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   590
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   591
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   592
jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   593
  return Agent_Initialize(jvm, options, reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   594
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   595
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   596
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   597
jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   598
  return Agent_Initialize(jvm, options, reserved);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   599
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   600
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   601
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   602
jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   603
  return JNI_VERSION_1_8;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   604
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   605
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   606
#define MAX_THREADS 500
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   607
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   608
typedef struct ThreadStats {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   609
  int number_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   610
  int counts[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   611
  int not_helper_counts[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   612
  int index[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   613
  jthread threads[MAX_THREADS];
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   614
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   615
  int method_resolution_problem;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   616
} ThreadStats;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   617
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   618
static ThreadStats thread_stats;
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 void add_thread_count(jthread thread, int lock, int helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   621
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   622
  jvmtiThreadInfo info;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   623
  const char* name;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   624
  char* end;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   625
  int idx;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   626
  int err;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   627
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   628
  if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   629
    event_storage_lock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   630
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   631
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   632
  for (i = 0; i < thread_stats.number_threads; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   633
    if (thread_stats.threads[i] == thread) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   634
      if (helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   635
        thread_stats.counts[i]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   636
      } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   637
        thread_stats.not_helper_counts[i]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   638
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   639
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   640
      if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   641
        event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   642
      }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   643
      return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   644
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   645
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   646
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   647
  thread_stats.threads[thread_stats.number_threads] = thread;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   648
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   649
  err = (*jvmti)->GetThreadInfo(jvmti, thread, &info);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   650
  if (err != JVMTI_ERROR_NONE) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   651
    if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   652
      event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   653
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   654
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   655
    // Just to have it accounted as an error...
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   656
    info.name = "Allocator99";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   657
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   658
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   659
  if (!strstr(info.name, "Allocator")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   660
    if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   661
      event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   662
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   663
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   664
    // Just to have it accounted as an error...
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   665
    info.name = "Allocator98";
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   666
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   667
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   668
  name = info.name + 9;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   669
  end = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   670
  idx = strtol(name, &end, 0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   671
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   672
  if (*end == '\0') {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   673
    if (helper) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   674
      thread_stats.counts[thread_stats.number_threads]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   675
    } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   676
      thread_stats.not_helper_counts[thread_stats.number_threads]++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   677
    }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   678
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   679
    thread_stats.index[thread_stats.number_threads] = idx;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   680
    thread_stats.number_threads++;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   681
  } else {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   682
    fprintf(stderr, "Problem with thread name...: %p %s\n", thread, name);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   683
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   684
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   685
  if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   686
    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
   687
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   688
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   689
  if (lock) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   690
    event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   691
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   692
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   693
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   694
static void print_thread_stats() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   695
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   696
  event_storage_lock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   697
  fprintf(stderr, "Method resolution problem: %d\n", thread_stats.method_resolution_problem);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   698
  fprintf(stderr, "Thread count:\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   699
  for (i = 0; i < thread_stats.number_threads; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   700
    fprintf(stderr, "\t%p: %d: %d - %d\n", thread_stats.threads[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   701
            thread_stats.index[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   702
            thread_stats.counts[i],
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   703
            thread_stats.not_helper_counts[i]);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   704
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   705
  event_storage_unlock(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   706
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   707
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   708
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   709
void JNICALL SampledObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   710
                                JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   711
                                jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   712
                                jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   713
                                jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   714
                                jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   715
  add_thread_count(thread, 1, 1);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   716
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   717
  if (event_storage_get_compaction_required(&global_event_storage)) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   718
    event_storage_compact(&global_event_storage, jni_env);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   719
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   720
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   721
  event_storage_add(&global_event_storage, jni_env, thread, object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   722
                    object_klass, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   723
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   724
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   725
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   726
void JNICALL VMObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   727
                           JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   728
                           jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   729
                           jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   730
                           jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   731
                           jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   732
  event_storage_add(&second_global_event_storage, jni_env, thread, object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   733
                    object_klass, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   734
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   735
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   736
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   737
void JNICALL GarbageCollectionFinish(jvmtiEnv *jvmti_env) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   738
  event_storage_set_compaction_required(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   739
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   740
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   741
static int enable_notifications() {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   742
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   743
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   744
                     "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   745
    return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   746
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   747
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   748
  return check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   749
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   750
                     "Set event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   751
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   752
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   753
static int enable_notifications_for_two_threads(jthread first, jthread second) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   754
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   755
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   756
                           "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   757
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   758
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   759
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   760
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   761
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, first),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   762
                  "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   763
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   764
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   765
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   766
  // Second thread should fail.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   767
  if (check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   768
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, second),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   769
                  "Set event notifications")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   770
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   771
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   772
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   773
  return 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   774
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   775
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   776
static
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   777
jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   778
  jint res;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   779
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   780
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   781
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   782
  res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   783
                                 JVMTI_VERSION_9);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   784
  if (res != JNI_OK || jvmti == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   785
    fprintf(stderr, "Error: wrong result of a valid call to GetEnv!\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   786
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   787
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   788
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   789
  // Get second jvmti environment.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   790
  res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &second_jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   791
                                 JVMTI_VERSION_9);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   792
  if (res != JNI_OK || second_jvmti == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   793
    fprintf(stderr, "Error: wrong result of a valid second call to GetEnv!\n");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   794
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   795
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   796
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   797
  if (PRINT_OUT) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   798
    fprintf(stderr, "Storage is at %p, secondary is at %p\n",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   799
            &global_event_storage, &second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   800
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   801
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   802
  (*jvmti)->CreateRawMonitor(jvmti, "storage_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   803
                             &global_event_storage.storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   804
  (*jvmti)->CreateRawMonitor(jvmti, "second_storage_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   805
                             &second_global_event_storage.storage_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   806
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   807
  (*jvmti)->CreateRawMonitor(jvmti, "compaction_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   808
                             &global_event_storage.compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   809
  (*jvmti)->CreateRawMonitor(jvmti, "second_compaction_monitor",
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   810
                             &second_global_event_storage.compaction_monitor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   811
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   812
  event_storage_set_garbage_history(&global_event_storage, 200);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   813
  event_storage_set_garbage_history(&second_global_event_storage, 200);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   814
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   815
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   816
  callbacks.SampledObjectAlloc = &SampledObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   817
  callbacks.VMObjectAlloc = &VMObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   818
  callbacks.GarbageCollectionFinish = &GarbageCollectionFinish;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   819
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   820
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   821
  // Get line numbers, sample events, filename, and gc events for the tests.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   822
  caps.can_get_line_numbers = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   823
  caps.can_get_source_file_name = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   824
  caps.can_generate_garbage_collection_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   825
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   826
  caps.can_generate_vm_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   827
  if (check_error((*jvmti)->AddCapabilities(jvmti, &caps), "Add capabilities")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   828
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   829
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   830
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   831
  if (check_error((*jvmti)->SetEventCallbacks(jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   832
                                              sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   833
                  " Set Event Callbacks")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   834
    return JNI_ERR;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   835
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   836
  return JNI_OK;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   837
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   838
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   839
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   840
Java_MyPackage_HeapMonitor_setSamplingRate(JNIEnv* env, jclass cls, jint value) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   841
  (*jvmti)->SetHeapSamplingRate(jvmti, value);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   842
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   843
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   844
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   845
Java_MyPackage_HeapMonitor_eventStorageIsEmpty(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   846
  return event_storage_get_count(&global_event_storage) == 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   847
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   848
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   849
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   850
Java_MyPackage_HeapMonitor_getEventStorageElementCount(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   851
  return event_storage_get_count(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   852
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   853
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   854
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   855
Java_MyPackage_HeapMonitor_enableSamplingEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   856
  enable_notifications();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   857
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   858
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   859
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   860
Java_MyPackage_HeapMonitor_enableSamplingEventsForTwoThreads(JNIEnv* env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   861
                                                             jclass cls,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   862
                                                             jthread first,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   863
                                                             jthread second) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   864
  return enable_notifications_for_two_threads(first, second);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   865
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   866
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   867
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   868
Java_MyPackage_HeapMonitor_disableSamplingEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   869
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   870
      jvmti, JVMTI_DISABLE, JVMTI_EVENT_SAMPLED_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   871
              "Set event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   872
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   873
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   874
      jvmti, JVMTI_DISABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   875
              "Garbage Collection Finish");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   876
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   877
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   878
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   879
Java_MyPackage_HeapMonitor_obtainedEvents(JNIEnv* env, jclass cls, jobjectArray frames) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   880
  jboolean result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   881
  jsize size = (*env)->GetArrayLength(env, frames);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   882
  ExpectedContentFrame *native_frames = malloc(size * sizeof(*native_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   883
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   884
  if (native_frames == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   885
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   886
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   887
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   888
  fill_native_frames(env, frames, native_frames, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   889
  result = event_storage_contains(env, &global_event_storage, native_frames, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   890
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   891
  free(native_frames), native_frames = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   892
  return result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   893
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   894
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   895
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   896
Java_MyPackage_HeapMonitor_garbageContains(JNIEnv* env, jclass cls, jobjectArray frames) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   897
  jboolean result;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   898
  jsize size = (*env)->GetArrayLength(env, frames);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   899
  ExpectedContentFrame *native_frames = malloc(size * sizeof(*native_frames));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   900
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   901
  if (native_frames == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   902
    return 0;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   903
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   904
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   905
  fill_native_frames(env, frames, native_frames, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   906
  result = event_storage_garbage_contains(env, &global_event_storage, native_frames, size);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   907
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   908
  free(native_frames), native_frames = NULL;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   909
  return result;
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
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   913
Java_MyPackage_HeapMonitor_forceGarbageCollection(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   914
  check_error((*jvmti)->ForceGarbageCollection(jvmti),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   915
              "Forced Garbage Collection");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   916
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   917
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   918
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   919
Java_MyPackage_HeapMonitor_resetEventStorage(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   920
  event_storage_reset(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   921
  event_storage_reset(&second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   922
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   923
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   924
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   925
Java_MyPackage_HeapMonitorNoCapabilityTest_allSamplingMethodsFail(JNIEnv *env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   926
                                                                  jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   927
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   928
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   929
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   930
  if (check_error((*jvmti)->RelinquishCapabilities(jvmti, &caps),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   931
                  "Add capabilities\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   932
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   933
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   934
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   935
  if (check_capability_error((*jvmti)->SetHeapSamplingRate(jvmti, 1<<19),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   936
                             "Set Heap Sampling Rate")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   937
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   938
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   939
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   940
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   941
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   942
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   943
Java_MyPackage_HeapMonitorIllegalArgumentTest_testIllegalArgument(JNIEnv *env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   944
                                                                  jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   945
  if (check_error((*jvmti)->SetHeapSamplingRate(jvmti, 0),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   946
                  "Sampling rate 0 failed\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   947
    return FALSE;
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
  if (check_error((*jvmti)->SetHeapSamplingRate(jvmti, 1024),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   951
                  "Sampling rate 1024 failed\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   952
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   953
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   954
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   955
  if (!check_error((*jvmti)->SetHeapSamplingRate(jvmti, -1),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   956
                   "Sampling rate -1 passed\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   957
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   958
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   959
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   960
  if (!check_error((*jvmti)->SetHeapSamplingRate(jvmti, -1024),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   961
                   "Sampling rate -1024 passed\n")){
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   962
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   963
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   964
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   965
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   966
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   967
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   968
JNIEXPORT jdouble JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   969
Java_MyPackage_HeapMonitorStatRateTest_getAverageRate(JNIEnv *env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   970
  return event_storage_get_average_rate(&global_event_storage);
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
typedef struct sThreadsFound {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   974
  jthread* threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   975
  int num_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   976
} ThreadsFound;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   977
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   978
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   979
Java_MyPackage_HeapMonitorThreadTest_checkSamples(JNIEnv* env, jclass cls,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   980
                                                  jint num_threads) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   981
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   982
  print_thread_stats();
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   983
  // Ensure we got stacks from at least num_threads.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   984
  return thread_stats.number_threads >= num_threads;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   985
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   986
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   987
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   988
void JNICALL SampledObjectAlloc2(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   989
                                 JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   990
                                 jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   991
                                 jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   992
                                 jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   993
                                 jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   994
  // Nop for now, two agents are not yet implemented.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   995
  assert(0);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   996
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   997
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   998
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
   999
Java_MyPackage_HeapMonitorTwoAgentsTest_enablingSamplingInSecondaryAgent(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1000
    JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1001
  // Currently this method should be failing directly at the AddCapability step
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1002
  // but the implementation is correct for when multi-agent support is enabled.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1003
  jvmtiCapabilities caps;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1004
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1005
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1006
  memset(&caps, 0, sizeof(caps));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1007
  caps.can_generate_sampled_object_alloc_events = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1008
  if (check_error((*second_jvmti)->AddCapabilities(second_jvmti, &caps),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1009
                  "Set the capability for second agent")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1010
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1011
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1012
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1013
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1014
  callbacks.SampledObjectAlloc = &SampledObjectAlloc2;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1015
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1016
  if (check_error((*second_jvmti)->SetEventCallbacks(second_jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1017
                                                     sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1018
                  " Set Event Callbacks for second agent")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1019
    return FALSE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1020
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1021
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1022
  return TRUE;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1023
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1024
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1025
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1026
Java_MyPackage_HeapMonitor_enableVMEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1027
  check_error((*jvmti)->SetEventNotificationMode(
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1028
      jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1029
              "Set vm event notifications");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1030
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1031
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1032
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1033
Java_MyPackage_HeapMonitorVMEventsTest_vmEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1034
  return event_storage_number_additions(&second_global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1035
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1036
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1037
JNIEXPORT jint JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1038
Java_MyPackage_HeapMonitor_sampledEvents(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1039
  return event_storage_number_additions(&global_event_storage);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1040
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1041
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1042
static void allocate_object(JNIEnv* env) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1043
  // Construct an Object.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1044
  jclass cls = (*env)->FindClass(env, "java/lang/Object");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1045
  jmethodID constructor;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1046
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1047
  if (cls == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1048
    throw_exception(env, "Cannot find Object class.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1049
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1050
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1051
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1052
  constructor = (*env)->GetMethodID(env, cls, "<init>", "()V");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1053
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1054
  if (constructor == NULL) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1055
    throw_exception(env, "Cannot find Object class constructor.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1056
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1057
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1058
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1059
  // Call back constructor to allocate a new instance, with an int argument
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1060
  (*env)->NewObject(env, cls, constructor);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1061
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1062
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1063
// Ensure we got a callback for the test.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1064
static int did_recursive_callback_test;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1065
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1066
JNIEXPORT
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1067
void JNICALL RecursiveSampledObjectAlloc(jvmtiEnv *jvmti_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1068
                                         JNIEnv* jni_env,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1069
                                         jthread thread,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1070
                                         jobject object,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1071
                                         jclass object_klass,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1072
                                         jlong size) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1073
  // 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
  1074
  // infinite recursion here.
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1075
  int i;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1076
  for (i = 0; i < 1000; i++) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1077
    allocate_object(jni_env);
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1078
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1079
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1080
  did_recursive_callback_test = 1;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1081
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1082
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1083
JNIEXPORT jboolean JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1084
Java_MyPackage_HeapMonitorRecursiveTest_didCallback(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1085
  return did_recursive_callback_test != 0;
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
JNIEXPORT void JNICALL
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1089
Java_MyPackage_HeapMonitorRecursiveTest_setCallbackToCallAllocateSomeMore(JNIEnv* env, jclass cls) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1090
  jvmtiEventCallbacks callbacks;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1091
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1092
  memset(&callbacks, 0, sizeof(callbacks));
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1093
  callbacks.SampledObjectAlloc = &RecursiveSampledObjectAlloc;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1094
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1095
  if (check_error((*jvmti)->SetEventCallbacks(jvmti, &callbacks,
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1096
                                              sizeof(jvmtiEventCallbacks)),
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1097
                  " Set Event Callbacks")) {
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1098
    throw_exception(env, "Cannot reset the callback.");
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1099
    return;
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1100
  }
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1101
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1102
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1103
#ifdef __cplusplus
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1104
}
1596f418ffe4 8205096: Add missing files for 8203394
jcbeyler
parents:
diff changeset
  1105
#endif