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