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
|