src/share/vm/prims/whitebox.cpp

Print this page
rev 6878 : 8049599: MetaspaceGC::_capacity_until_GC can overflow


 769 
 770   oop class_loader_oop = JNIHandles::resolve(class_loader);
 771   ClassLoaderData* cld = class_loader_oop != NULL
 772       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 773       : ClassLoaderData::the_null_class_loader_data();
 774 
 775   void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
 776 
 777   return (jlong)(uintptr_t)metadata;
 778 WB_END
 779 
 780 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
 781   oop class_loader_oop = JNIHandles::resolve(class_loader);
 782   ClassLoaderData* cld = class_loader_oop != NULL
 783       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 784       : ClassLoaderData::the_null_class_loader_data();
 785 
 786   MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
 787 WB_END
 788 



















 789 //Some convenience methods to deal with objects from java
 790 int WhiteBox::offset_for_field(const char* field_name, oop object,
 791     Symbol* signature_symbol) {
 792   assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
 793   Thread* THREAD = Thread::current();
 794 
 795   //Get the class of our object
 796   Klass* arg_klass = object->klass();
 797   //Turn it into an instance-klass
 798   InstanceKlass* ik = InstanceKlass::cast(arg_klass);
 799 
 800   //Create symbols to look for in the class
 801   TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
 802       THREAD);
 803 
 804   //To be filled in with an offset of the field we're looking for
 805   fieldDescriptor fd;
 806 
 807   Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
 808   if (res == NULL) {


 907                                                       (void*)&WB_GetBooleanVMFlag},
 908   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 909                                                       (void*)&WB_GetIntxVMFlag},
 910   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 911                                                       (void*)&WB_GetUintxVMFlag},
 912   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 913                                                       (void*)&WB_GetUint64VMFlag},
 914   {CC"getSizeTVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 915                                                       (void*)&WB_GetSizeTVMFlag},
 916   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 917                                                       (void*)&WB_GetDoubleVMFlag},
 918   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 919                                                       (void*)&WB_GetStringVMFlag},
 920   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 921   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 922   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
 923   {CC"allocateMetaspace",
 924      CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
 925   {CC"freeMetaspace",
 926      CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },


 927   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 928   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 929                                                       (void*)&WB_GetNMethod         },
 930   {CC"getThreadStackSize", CC"()J",                   (void*)&WB_GetThreadStackSize },
 931   {CC"getThreadRemainingStackSize", CC"()J",          (void*)&WB_GetThreadRemainingStackSize },
 932 };
 933 
 934 #undef CC
 935 
 936 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
 937   {
 938     if (WhiteBoxAPI) {
 939       // Make sure that wbclass is loaded by the null classloader
 940       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
 941       Handle loader(ikh->class_loader());
 942       if (loader.is_null()) {
 943         ResourceMark rm;
 944         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
 945         bool result = true;
 946         //  one by one registration natives for exception catching




 769 
 770   oop class_loader_oop = JNIHandles::resolve(class_loader);
 771   ClassLoaderData* cld = class_loader_oop != NULL
 772       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 773       : ClassLoaderData::the_null_class_loader_data();
 774 
 775   void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
 776 
 777   return (jlong)(uintptr_t)metadata;
 778 WB_END
 779 
 780 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
 781   oop class_loader_oop = JNIHandles::resolve(class_loader);
 782   ClassLoaderData* cld = class_loader_oop != NULL
 783       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 784       : ClassLoaderData::the_null_class_loader_data();
 785 
 786   MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
 787 WB_END
 788 
 789 WB_ENTRY(jlong, WB_IncMetaspaceCapacityUntilGC(JNIEnv* env, jobject wb, jlong size))
 790   if (size < 0) {
 791     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
 792         err_msg("WB_IncMetaspaceCapacityUntilGC: size is negative: " JLONG_FORMAT, size));
 793   }
 794 
 795   if (size > (jlong) ((size_t) -1)) {
 796     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
 797         err_msg("WB_IncMetaspaceCapacityUntilGC: size does not fit in size_t: " JLONG_FORMAT, size));
 798   }
 799 
 800   size_t new_val = MetaspaceGC::inc_capacity_until_GC(align_size_down((size_t) size, Metaspace::commit_alignment()));
 801   return (jlong) new_val;
 802 WB_END
 803 
 804 WB_ENTRY(jlong, WB_MetaspaceCapacityUntilGC(JNIEnv* env, jobject wb))
 805   return (jlong) MetaspaceGC::capacity_until_GC();
 806 WB_END
 807 
 808 //Some convenience methods to deal with objects from java
 809 int WhiteBox::offset_for_field(const char* field_name, oop object,
 810     Symbol* signature_symbol) {
 811   assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
 812   Thread* THREAD = Thread::current();
 813 
 814   //Get the class of our object
 815   Klass* arg_klass = object->klass();
 816   //Turn it into an instance-klass
 817   InstanceKlass* ik = InstanceKlass::cast(arg_klass);
 818 
 819   //Create symbols to look for in the class
 820   TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
 821       THREAD);
 822 
 823   //To be filled in with an offset of the field we're looking for
 824   fieldDescriptor fd;
 825 
 826   Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
 827   if (res == NULL) {


 926                                                       (void*)&WB_GetBooleanVMFlag},
 927   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 928                                                       (void*)&WB_GetIntxVMFlag},
 929   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 930                                                       (void*)&WB_GetUintxVMFlag},
 931   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 932                                                       (void*)&WB_GetUint64VMFlag},
 933   {CC"getSizeTVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 934                                                       (void*)&WB_GetSizeTVMFlag},
 935   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 936                                                       (void*)&WB_GetDoubleVMFlag},
 937   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 938                                                       (void*)&WB_GetStringVMFlag},
 939   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 940   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 941   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
 942   {CC"allocateMetaspace",
 943      CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
 944   {CC"freeMetaspace",
 945      CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },
 946   {CC"incMetaspaceCapacityUntilGC", CC"(J)J",         (void*)&WB_IncMetaspaceCapacityUntilGC },
 947   {CC"metaspaceCapacityUntilGC", CC"()J",             (void*)&WB_MetaspaceCapacityUntilGC },
 948   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 949   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 950                                                       (void*)&WB_GetNMethod         },
 951   {CC"getThreadStackSize", CC"()J",                   (void*)&WB_GetThreadStackSize },
 952   {CC"getThreadRemainingStackSize", CC"()J",          (void*)&WB_GetThreadRemainingStackSize },
 953 };
 954 
 955 #undef CC
 956 
 957 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
 958   {
 959     if (WhiteBoxAPI) {
 960       // Make sure that wbclass is loaded by the null classloader
 961       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
 962       Handle loader(ikh->class_loader());
 963       if (loader.is_null()) {
 964         ResourceMark rm;
 965         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
 966         bool result = true;
 967         //  one by one registration natives for exception catching