src/share/vm/prims/whitebox.cpp

changeset 6992
2c6ef90f030a
parent 6963
0c48231c5c84
child 7050
6701abbc4441
     1.1 --- a/src/share/vm/prims/whitebox.cpp	Tue Jul 01 09:03:55 2014 +0200
     1.2 +++ b/src/share/vm/prims/whitebox.cpp	Mon Jul 07 10:12:40 2014 +0200
     1.3 @@ -24,6 +24,7 @@
     1.4  
     1.5  #include "precompiled.hpp"
     1.6  
     1.7 +#include "memory/metadataFactory.hpp"
     1.8  #include "memory/universe.hpp"
     1.9  #include "oops/oop.inline.hpp"
    1.10  
    1.11 @@ -36,6 +37,7 @@
    1.12  #include "runtime/arguments.hpp"
    1.13  #include "runtime/interfaceSupport.hpp"
    1.14  #include "runtime/os.hpp"
    1.15 +#include "utilities/array.hpp"
    1.16  #include "utilities/debug.hpp"
    1.17  #include "utilities/macros.hpp"
    1.18  #include "utilities/exceptions.hpp"
    1.19 @@ -725,6 +727,35 @@
    1.20  WB_END
    1.21  
    1.22  
    1.23 +int WhiteBox::array_bytes_to_length(size_t bytes) {
    1.24 +  return Array<u1>::bytes_to_length(bytes);
    1.25 +}
    1.26 +
    1.27 +WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
    1.28 +  if (size < 0) {
    1.29 +    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
    1.30 +        err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
    1.31 +  }
    1.32 +
    1.33 +  oop class_loader_oop = JNIHandles::resolve(class_loader);
    1.34 +  ClassLoaderData* cld = class_loader_oop != NULL
    1.35 +      ? java_lang_ClassLoader::loader_data(class_loader_oop)
    1.36 +      : ClassLoaderData::the_null_class_loader_data();
    1.37 +
    1.38 +  void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
    1.39 +
    1.40 +  return (jlong)(uintptr_t)metadata;
    1.41 +WB_END
    1.42 +
    1.43 +WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
    1.44 +  oop class_loader_oop = JNIHandles::resolve(class_loader);
    1.45 +  ClassLoaderData* cld = class_loader_oop != NULL
    1.46 +      ? java_lang_ClassLoader::loader_data(class_loader_oop)
    1.47 +      : ClassLoaderData::the_null_class_loader_data();
    1.48 +
    1.49 +  MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
    1.50 +WB_END
    1.51 +
    1.52  //Some convenience methods to deal with objects from java
    1.53  int WhiteBox::offset_for_field(const char* field_name, oop object,
    1.54      Symbol* signature_symbol) {
    1.55 @@ -855,6 +886,10 @@
    1.56    {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
    1.57    {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
    1.58    {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
    1.59 +  {CC"allocateMetaspace",
    1.60 +     CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
    1.61 +  {CC"freeMetaspace",
    1.62 +     CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },
    1.63    {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
    1.64    {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
    1.65                                                        (void*)&WB_GetNMethod         },

mercurial