src/share/vm/prims/whitebox.cpp

Print this page




   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 

  27 #include "memory/universe.hpp"
  28 #include "oops/oop.inline.hpp"
  29 
  30 #include "classfile/stringTable.hpp"
  31 #include "classfile/classLoaderData.hpp"
  32 
  33 #include "prims/whitebox.hpp"
  34 #include "prims/wbtestmethods/parserTests.hpp"
  35 
  36 #include "runtime/thread.hpp"
  37 #include "runtime/arguments.hpp"
  38 #include "runtime/interfaceSupport.hpp"
  39 #include "runtime/os.hpp"
  40 

  41 #include "utilities/debug.hpp"
  42 #include "utilities/macros.hpp"
  43 #include "utilities/exceptions.hpp"
  44 
  45 #if INCLUDE_ALL_GCS
  46 #include "gc_implementation/g1/concurrentMark.hpp"
  47 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
  48 #include "gc_implementation/g1/heapRegionRemSet.hpp"
  49 #endif // INCLUDE_ALL_GCS
  50 
  51 #ifdef INCLUDE_NMT
  52 #include "services/memTracker.hpp"
  53 #endif // INCLUDE_NMT
  54 
  55 #include "compiler/compileBroker.hpp"
  56 #include "runtime/compilationPolicy.hpp"
  57 
  58 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
  59 
  60 #define SIZE_T_MAX_VALUE ((size_t) -1)


 709   ThreadToNativeFromVM ttn(thread);
 710   jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
 711   CHECK_JNI_EXCEPTION_(env, NULL);
 712   result = env->NewObjectArray(2, clazz, NULL);
 713   if (result == NULL) {
 714     return result;
 715   }
 716 
 717   jobject obj = integerBox(thread, env, code->comp_level());
 718   CHECK_JNI_EXCEPTION_(env, NULL);
 719   env->SetObjectArrayElement(result, 0, obj);
 720 
 721   jbyteArray insts = env->NewByteArray(insts_size);
 722   CHECK_JNI_EXCEPTION_(env, NULL);
 723   env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
 724   env->SetObjectArrayElement(result, 1, insts);
 725 
 726   return result;
 727 WB_END
 728 
 729 
 730 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
 731   return (jlong) Thread::current()->stack_size();
 732 WB_END
 733 
 734 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
 735   JavaThread* t = JavaThread::current();
 736   return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
 737 WB_END
 738 





























 739 //Some convenience methods to deal with objects from java
 740 int WhiteBox::offset_for_field(const char* field_name, oop object,
 741     Symbol* signature_symbol) {
 742   assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
 743   Thread* THREAD = Thread::current();
 744 
 745   //Get the class of our object
 746   Klass* arg_klass = object->klass();
 747   //Turn it into an instance-klass
 748   InstanceKlass* ik = InstanceKlass::cast(arg_klass);
 749 
 750   //Create symbols to look for in the class
 751   TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
 752       THREAD);
 753 
 754   //To be filled in with an offset of the field we're looking for
 755   fieldDescriptor fd;
 756 
 757   Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
 758   if (res == NULL) {


 849   {CC"setUintxVMFlag",     CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
 850   {CC"setUint64VMFlag",    CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
 851   {CC"setDoubleVMFlag",    CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
 852   {CC"setStringVMFlag",    CC"(Ljava/lang/String;Ljava/lang/String;)V",
 853                                                       (void*)&WB_SetStringVMFlag},
 854   {CC"getBooleanVMFlag",   CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
 855                                                       (void*)&WB_GetBooleanVMFlag},
 856   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 857                                                       (void*)&WB_GetIntxVMFlag},
 858   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 859                                                       (void*)&WB_GetUintxVMFlag},
 860   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 861                                                       (void*)&WB_GetUint64VMFlag},
 862   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 863                                                       (void*)&WB_GetDoubleVMFlag},
 864   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 865                                                       (void*)&WB_GetStringVMFlag},
 866   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 867   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 868   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },




 869   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 870   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 871                                                       (void*)&WB_GetNMethod         },
 872   {CC"getThreadStackSize", CC"()J",                   (void*)&WB_GetThreadStackSize },
 873   {CC"getThreadRemainingStackSize", CC"()J",          (void*)&WB_GetThreadRemainingStackSize },
 874 };
 875 
 876 #undef CC
 877 
 878 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
 879   {
 880     if (WhiteBoxAPI) {
 881       // Make sure that wbclass is loaded by the null classloader
 882       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
 883       Handle loader(ikh->class_loader());
 884       if (loader.is_null()) {
 885         ResourceMark rm;
 886         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
 887         bool result = true;
 888         //  one by one registration natives for exception catching




   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 
  27 #include "memory/metadataFactory.hpp"
  28 #include "memory/universe.hpp"
  29 #include "oops/oop.inline.hpp"
  30 
  31 #include "classfile/stringTable.hpp"
  32 #include "classfile/classLoaderData.hpp"
  33 
  34 #include "prims/whitebox.hpp"
  35 #include "prims/wbtestmethods/parserTests.hpp"
  36 
  37 #include "runtime/thread.hpp"
  38 #include "runtime/arguments.hpp"
  39 #include "runtime/interfaceSupport.hpp"
  40 #include "runtime/os.hpp"
  41 
  42 #include "utilities/array.hpp"
  43 #include "utilities/debug.hpp"
  44 #include "utilities/macros.hpp"
  45 #include "utilities/exceptions.hpp"
  46 
  47 #if INCLUDE_ALL_GCS
  48 #include "gc_implementation/g1/concurrentMark.hpp"
  49 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
  50 #include "gc_implementation/g1/heapRegionRemSet.hpp"
  51 #endif // INCLUDE_ALL_GCS
  52 
  53 #ifdef INCLUDE_NMT
  54 #include "services/memTracker.hpp"
  55 #endif // INCLUDE_NMT
  56 
  57 #include "compiler/compileBroker.hpp"
  58 #include "runtime/compilationPolicy.hpp"
  59 
  60 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
  61 
  62 #define SIZE_T_MAX_VALUE ((size_t) -1)


 711   ThreadToNativeFromVM ttn(thread);
 712   jclass clazz = env->FindClass(vmSymbols::java_lang_Object()->as_C_string());
 713   CHECK_JNI_EXCEPTION_(env, NULL);
 714   result = env->NewObjectArray(2, clazz, NULL);
 715   if (result == NULL) {
 716     return result;
 717   }
 718 
 719   jobject obj = integerBox(thread, env, code->comp_level());
 720   CHECK_JNI_EXCEPTION_(env, NULL);
 721   env->SetObjectArrayElement(result, 0, obj);
 722 
 723   jbyteArray insts = env->NewByteArray(insts_size);
 724   CHECK_JNI_EXCEPTION_(env, NULL);
 725   env->SetByteArrayRegion(insts, 0, insts_size, (jbyte*) code->insts_begin());
 726   env->SetObjectArrayElement(result, 1, insts);
 727 
 728   return result;
 729 WB_END
 730 

 731 WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
 732   return (jlong) Thread::current()->stack_size();
 733 WB_END
 734 
 735 WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
 736   JavaThread* t = JavaThread::current();
 737   return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
 738 WB_END
 739 
 740 int WhiteBox::array_bytes_to_length(size_t bytes) {
 741   return Array<u1>::bytes_to_length(bytes);
 742 }
 743 
 744 WB_ENTRY(jlong, WB_AllocateMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong size))
 745   if (size < 0) {
 746     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
 747         err_msg("WB_AllocateMetaspace: size is negative: " JLONG_FORMAT, size));
 748   }
 749 
 750   oop class_loader_oop = JNIHandles::resolve(class_loader);
 751   ClassLoaderData* cld = class_loader_oop != NULL
 752       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 753       : ClassLoaderData::the_null_class_loader_data();
 754 
 755   void* metadata = MetadataFactory::new_writeable_array<u1>(cld, WhiteBox::array_bytes_to_length((size_t)size), thread);
 756 
 757   return (jlong)(uintptr_t)metadata;
 758 WB_END
 759 
 760 WB_ENTRY(void, WB_FreeMetaspace(JNIEnv* env, jobject wb, jobject class_loader, jlong addr, jlong size))
 761   oop class_loader_oop = JNIHandles::resolve(class_loader);
 762   ClassLoaderData* cld = class_loader_oop != NULL
 763       ? java_lang_ClassLoader::loader_data(class_loader_oop)
 764       : ClassLoaderData::the_null_class_loader_data();
 765 
 766   MetadataFactory::free_array(cld, (Array<u1>*)(uintptr_t)addr);
 767 WB_END
 768 
 769 //Some convenience methods to deal with objects from java
 770 int WhiteBox::offset_for_field(const char* field_name, oop object,
 771     Symbol* signature_symbol) {
 772   assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
 773   Thread* THREAD = Thread::current();
 774 
 775   //Get the class of our object
 776   Klass* arg_klass = object->klass();
 777   //Turn it into an instance-klass
 778   InstanceKlass* ik = InstanceKlass::cast(arg_klass);
 779 
 780   //Create symbols to look for in the class
 781   TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
 782       THREAD);
 783 
 784   //To be filled in with an offset of the field we're looking for
 785   fieldDescriptor fd;
 786 
 787   Klass* res = ik->find_field(name_symbol, signature_symbol, &fd);
 788   if (res == NULL) {


 879   {CC"setUintxVMFlag",     CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
 880   {CC"setUint64VMFlag",    CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
 881   {CC"setDoubleVMFlag",    CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
 882   {CC"setStringVMFlag",    CC"(Ljava/lang/String;Ljava/lang/String;)V",
 883                                                       (void*)&WB_SetStringVMFlag},
 884   {CC"getBooleanVMFlag",   CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
 885                                                       (void*)&WB_GetBooleanVMFlag},
 886   {CC"getIntxVMFlag",      CC"(Ljava/lang/String;)Ljava/lang/Long;",
 887                                                       (void*)&WB_GetIntxVMFlag},
 888   {CC"getUintxVMFlag",     CC"(Ljava/lang/String;)Ljava/lang/Long;",
 889                                                       (void*)&WB_GetUintxVMFlag},
 890   {CC"getUint64VMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Long;",
 891                                                       (void*)&WB_GetUint64VMFlag},
 892   {CC"getDoubleVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/Double;",
 893                                                       (void*)&WB_GetDoubleVMFlag},
 894   {CC"getStringVMFlag",    CC"(Ljava/lang/String;)Ljava/lang/String;",
 895                                                       (void*)&WB_GetStringVMFlag},
 896   {CC"isInStringTable",    CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable  },
 897   {CC"fullGC",   CC"()V",                             (void*)&WB_FullGC },
 898   {CC"readReservedMemory", CC"()V",                   (void*)&WB_ReadReservedMemory },
 899   {CC"allocateMetaspace",
 900      CC"(Ljava/lang/ClassLoader;J)J",                 (void*)&WB_AllocateMetaspace },
 901   {CC"freeMetaspace",
 902      CC"(Ljava/lang/ClassLoader;JJ)V",                (void*)&WB_FreeMetaspace },
 903   {CC"getCPUFeatures",     CC"()Ljava/lang/String;",  (void*)&WB_GetCPUFeatures     },
 904   {CC"getNMethod",         CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
 905                                                       (void*)&WB_GetNMethod         },
 906   {CC"getThreadStackSize", CC"()J",                   (void*)&WB_GetThreadStackSize },
 907   {CC"getThreadRemainingStackSize", CC"()J",          (void*)&WB_GetThreadRemainingStackSize },
 908 };
 909 
 910 #undef CC
 911 
 912 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
 913   {
 914     if (WhiteBoxAPI) {
 915       // Make sure that wbclass is loaded by the null classloader
 916       instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass());
 917       Handle loader(ikh->class_loader());
 918       if (loader.is_null()) {
 919         ResourceMark rm;
 920         ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
 921         bool result = true;
 922         //  one by one registration natives for exception catching