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 },