hotspot/src/share/vm/prims/whitebox.cpp
author mgerdin
Thu, 23 Feb 2012 14:58:35 +0100
changeset 12095 cc3d6f08a4c4
child 12262 fb3b9fede660
permissions -rw-r--r--
7148152: Add whitebox testing API to HotSpot Summary: Add an internal testing API to HotSpot to enable more targeted testing of vm functionality Reviewed-by: phh, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12095
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     1
/*
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     4
 *
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     7
 * published by the Free Software Foundation.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     8
 *
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    13
 * accompanied this code).
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    14
 *
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    18
 *
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    21
 * questions.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    22
 *
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    23
 */
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    24
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    25
#include "precompiled.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    26
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    27
#include "jni.h"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    28
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    29
#include "memory/universe.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    30
#include "oops/oop.inline.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    31
#include "prims/whitebox.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    32
#include "runtime/interfaceSupport.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    33
#include "runtime/os.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    34
#include "utilities/debug.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    35
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    36
#ifndef SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    37
#include "gc_implementation/g1/concurrentMark.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    38
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    39
#include "gc_implementation/g1/heapRegionRemSet.hpp"
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    40
#endif // !SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    41
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    42
bool WhiteBox::_used = false;
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    43
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    44
// Entry macro to transition from JNI to VM state.
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    45
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    46
#define WB_ENTRY(result_type, header) JNI_ENTRY(result_type, header)
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    47
#define WB_END JNI_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    48
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    49
// Definitions of functions exposed via Whitebox API
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    50
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    51
WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    52
  return (jlong)(void*)JNIHandles::resolve(obj);
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    53
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    54
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    55
WB_ENTRY(jint, WB_GetHeapOopSize(JNIEnv* env, jobject o))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    56
  return heapOopSize;
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    57
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    58
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    59
#ifndef SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    60
WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    61
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    62
  oop result = JNIHandles::resolve(obj);
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    63
  const HeapRegion* hr = g1->heap_region_containing(result);
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    64
  return hr->isHumongous();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    65
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    66
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    67
WB_ENTRY(jlong, WB_G1NumFreeRegions(JNIEnv* env, jobject o))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    68
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    69
  size_t nr = g1->free_regions();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    70
  return (jlong)nr;
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    71
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    72
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    73
WB_ENTRY(jboolean, WB_G1InConcurrentMark(JNIEnv* env, jobject o))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    74
  G1CollectedHeap* g1 = G1CollectedHeap::heap();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    75
  ConcurrentMark* cm = g1->concurrent_mark();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    76
  return cm->concurrent_marking_in_progress();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    77
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    78
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    79
WB_ENTRY(jint, WB_G1RegionSize(JNIEnv* env, jobject o))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    80
  return (jint)HeapRegion::GrainBytes;
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    81
WB_END
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    82
#endif // !SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    83
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    84
#define CC (char*)
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    85
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    86
static JNINativeMethod methods[] = {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    87
  {CC"getObjectAddress",   CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress  },
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    88
  {CC"getHeapOopSize",     CC"()I",                   (void*)&WB_GetHeapOopSize    },
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    89
#ifndef SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    90
  {CC"g1InConcurrentMark", CC"()Z",                   (void*)&WB_G1InConcurrentMark},
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    91
  {CC"g1IsHumongous",      CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous     },
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    92
  {CC"g1NumFreeRegions",   CC"()J",                   (void*)&WB_G1NumFreeRegions  },
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    93
  {CC"g1RegionSize",       CC"()I",                   (void*)&WB_G1RegionSize      },
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    94
#endif // !SERIALGC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    95
};
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    96
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    97
#undef CC
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    98
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
    99
JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   100
  {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   101
    if (WhiteBoxAPI) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   102
      // Make sure that wbclass is loaded by the null classloader
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   103
      instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   104
      Handle loader(ikh->class_loader());
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   105
      if (loader.is_null()) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   106
        ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   107
        jint result = env->RegisterNatives(wbclass, methods, sizeof(methods)/sizeof(methods[0]));
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   108
        if (result == 0) {
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   109
          WhiteBox::set_used();
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   110
        }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   111
      }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   112
    }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   113
  }
cc3d6f08a4c4 7148152: Add whitebox testing API to HotSpot
mgerdin
parents:
diff changeset
   114
JVM_END