src/share/vm/prims/whitebox.cpp

Print this page
rev 6722 : 8049599: MetaspaceGC::_capacity_until_GC can overflow
Reviewed-by: jmasa, stefank


 777 
 778   oop class_loader_oop = JNIHandles::resolve(class_loader);
 779   ClassLoaderData* cld = class_loader_oop != NULL
 780       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 781       : ClassLoaderData::the_null_class_loader_data();
 782 
 783   void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
 784 
 785   return (jlong)(uintptr_t)metadata;
 786 WB_END
 787 
 788 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
 789   oop class_loader_oop = JNIHandles::resolve(class_loader);
 790   ClassLoaderData* cld = class_loader_oop != NULL
 791       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 792       : ClassLoaderData::the_null_class_loader_data();
 793 
 794   MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
 795 WB_END
 796 



























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


 945   {CC"getBooleanVMFlag",   CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
 946                                                       (void*)&WB_GetBooleanVMFlag},
 947   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 948                                                       (void*)&WB_GetIntxVMFlag},
 949   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 950                                                       (void*)&WB_GetUintxVMFlag},
 951   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 952                                                       (void*)&WB_GetUint64VMFlag},
 953   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 954                                                       (void*)&WB_GetDoubleVMFlag},
 955   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 956                                                       (void*)&WB_GetStringVMFlag},
 957   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 958   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 959   {CC"youngGC",  CC"()V",                             (void*)&WB_YoungGC },
 960   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
 961   {CC"allocateMetaspace",
 962      CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
 963   {CC"freeMetaspace",
 964      CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },


 965   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 966   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 967                                                       (void*)&WB_GetNMethod         },
 968 };
 969 
 970 #undef CC
 971 
 972 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
 973   {
 974     if (WhiteBoxAPI) {
 975       // Make sure that wbclass is loaded by the null classloader
 976       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
 977       Handle loader(ikh->class_loader());
 978       if (loader.is_null()) {
 979         WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0]));
 980         WhiteBox::register_extended(env, wbclass, thread);
 981         WhiteBox::set_used();
 982       }
 983     }
 984   }


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


 972   {CC"getBooleanVMFlag",   CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
 973                                                       (void*)&WB_GetBooleanVMFlag},
 974   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 975                                                       (void*)&WB_GetIntxVMFlag},
 976   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 977                                                       (void*)&WB_GetUintxVMFlag},
 978   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 979                                                       (void*)&WB_GetUint64VMFlag},
 980   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 981                                                       (void*)&WB_GetDoubleVMFlag},
 982   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 983                                                       (void*)&WB_GetStringVMFlag},
 984   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 985   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 986   {CC"youngGC",  CC"()V",                             (void*)&WB_YoungGC },
 987   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
 988   {CC"allocateMetaspace",
 989      CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
 990   {CC"freeMetaspace",
 991      CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },
 992   {CC"incMetaspaceCapacityUntilGC", CC"(J)J",         (void*)&WB_IncMetaspaceCapacityUntilGC },
 993   {CC"metaspaceCapacityUntilGC", CC"()J",             (void*)&WB_MetaspaceCapacityUntilGC },
 994   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 995   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 996                                                       (void*)&WB_GetNMethod         },
 997 };
 998 
 999 #undef CC
1000 
1001 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
1002   {
1003     if (WhiteBoxAPI) {
1004       // Make sure that wbclass is loaded by the null classloader
1005       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
1006       Handle loader(ikh->class_loader());
1007       if (loader.is_null()) {
1008         WhiteBox::register_methods(env, wbclass, thread, methods, sizeof(methods) / sizeof(methods[0]));
1009         WhiteBox::register_extended(env, wbclass, thread);
1010         WhiteBox::set_used();
1011       }
1012     }
1013   }