comparison src/share/vm/prims/whitebox.cpp @ 20249:0c48231c5c84

8038756: new WB API :: get/setVMFlag Reviewed-by: vlivanov, sla
author iignatyev
date Fri, 30 May 2014 17:20:48 +0400
parents 78bbf4d43a14
children 2c6ef90f030a
comparison
equal deleted inserted replaced
20248:009de2b033fc 20249:0c48231c5c84
499 mh->set_prev_time(0, THREAD); 499 mh->set_prev_time(0, THREAD);
500 #endif 500 #endif
501 } 501 }
502 WB_END 502 WB_END
503 503
504 template <typename T>
505 static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) {
506 if (name == NULL) {
507 return false;
508 }
509 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
510 const char* flag_name = env->GetStringUTFChars(name, NULL);
511 bool result = (*TAt)(flag_name, value);
512 env->ReleaseStringUTFChars(name, flag_name);
513 return result;
514 }
515
516 template <typename T>
517 static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) {
518 if (name == NULL) {
519 return false;
520 }
521 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
522 const char* flag_name = env->GetStringUTFChars(name, NULL);
523 bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL);
524 env->ReleaseStringUTFChars(name, flag_name);
525 return result;
526 }
527
528 template <typename T>
529 static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) {
530 ResourceMark rm(thread);
531 jclass clazz = env->FindClass(name->as_C_string());
532 CHECK_JNI_EXCEPTION_(env, NULL);
533 jmethodID methodID = env->GetStaticMethodID(clazz,
534 vmSymbols::valueOf_name()->as_C_string(),
535 sig->as_C_string());
536 CHECK_JNI_EXCEPTION_(env, NULL);
537 jobject result = env->CallStaticObjectMethod(clazz, methodID, value);
538 CHECK_JNI_EXCEPTION_(env, NULL);
539 return result;
540 }
541
542 static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) {
543 return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value);
544 }
545 static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) {
546 return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value);
547 }
548 static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) {
549 return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value);
550 }
551 /* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) {
552 return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value);
553 }*/
554 static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) {
555 return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value);
556 }
557
558 WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name))
559 bool result;
560 if (GetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAt)) {
561 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
562 return booleanBox(thread, env, result);
563 }
564 return NULL;
565 WB_END
566
567 WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name))
568 intx result;
569 if (GetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAt)) {
570 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
571 return longBox(thread, env, result);
572 }
573 return NULL;
574 WB_END
575
576 WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name))
577 uintx result;
578 if (GetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAt)) {
579 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
580 return longBox(thread, env, result);
581 }
582 return NULL;
583 WB_END
584
585 WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name))
586 uint64_t result;
587 if (GetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) {
588 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
589 return longBox(thread, env, result);
590 }
591 return NULL;
592 WB_END
593
594 WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name))
595 double result;
596 if (GetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAt)) {
597 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
598 return doubleBox(thread, env, result);
599 }
600 return NULL;
601 WB_END
602
603 WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name))
604 ccstr ccstrResult;
605 if (GetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) {
606 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
607 jstring result = env->NewStringUTF(ccstrResult);
608 CHECK_JNI_EXCEPTION_(env, NULL);
609 return result;
610 }
611 return NULL;
612 WB_END
613
614 WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value))
615 bool result = value == JNI_TRUE ? true : false;
616 SetVMFlag <bool> (thread, env, name, &result, &CommandLineFlags::boolAtPut);
617 WB_END
618
619 WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
620 intx result = value;
621 SetVMFlag <intx> (thread, env, name, &result, &CommandLineFlags::intxAtPut);
622 WB_END
623
624 WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
625 uintx result = value;
626 SetVMFlag <uintx> (thread, env, name, &result, &CommandLineFlags::uintxAtPut);
627 WB_END
628
629 WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value))
630 uint64_t result = value;
631 SetVMFlag <uint64_t> (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut);
632 WB_END
633
634 WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value))
635 double result = value;
636 SetVMFlag <double> (thread, env, name, &result, &CommandLineFlags::doubleAtPut);
637 WB_END
638
639 WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value))
640 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI
641 const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL);
642 ccstr ccstrResult = ccstrValue;
643 bool needFree;
644 {
645 ThreadInVMfromNative ttvfn(thread); // back to VM
646 needFree = SetVMFlag <ccstr> (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut);
647 }
648 if (value != NULL) {
649 env->ReleaseStringUTFChars(value, ccstrValue);
650 }
651 if (needFree) {
652 FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal);
653 }
654 WB_END
655
656
504 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString)) 657 WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
505 ResourceMark rm(THREAD); 658 ResourceMark rm(THREAD);
506 int len; 659 int len;
507 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false); 660 jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false);
508 return (StringTable::lookup(name, len) != NULL); 661 return (StringTable::lookup(name, len) != NULL);
557 result = env->NewObjectArray(2, clazz, NULL); 710 result = env->NewObjectArray(2, clazz, NULL);
558 if (result == NULL) { 711 if (result == NULL) {
559 return result; 712 return result;
560 } 713 }
561 714
562 clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string()); 715 jobject obj = integerBox(thread, env, code->comp_level());
563 CHECK_JNI_EXCEPTION_(env, NULL);
564 jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string());
565 CHECK_JNI_EXCEPTION_(env, NULL);
566 jobject obj = env->NewObject(clazz, constructor, code->comp_level());
567 CHECK_JNI_EXCEPTION_(env, NULL); 716 CHECK_JNI_EXCEPTION_(env, NULL);
568 env->SetObjectArrayElement(result, 0, obj); 717 env->SetObjectArrayElement(result, 0, obj);
569 718
570 jbyteArray insts = env->NewByteArray(insts_size); 719 jbyteArray insts = env->NewByteArray(insts_size);
571 CHECK_JNI_EXCEPTION_(env, NULL); 720 CHECK_JNI_EXCEPTION_(env, NULL);
682 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod}, 831 CC"(Ljava/lang/reflect/Executable;Z)Z", (void*)&WB_TestSetForceInlineMethod},
683 {CC"enqueueMethodForCompilation", 832 {CC"enqueueMethodForCompilation",
684 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation}, 833 CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation},
685 {CC"clearMethodState", 834 {CC"clearMethodState",
686 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, 835 CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
687 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, 836 {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag},
837 {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag},
838 {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag},
839 {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag},
840 {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag},
841 {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V",
842 (void*)&WB_SetStringVMFlag},
843 {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;",
844 (void*)&WB_GetBooleanVMFlag},
845 {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
846 (void*)&WB_GetIntxVMFlag},
847 {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
848 (void*)&WB_GetUintxVMFlag},
849 {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;",
850 (void*)&WB_GetUint64VMFlag},
851 {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;",
852 (void*)&WB_GetDoubleVMFlag},
853 {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;",
854 (void*)&WB_GetStringVMFlag},
855 {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
688 {CC"fullGC", CC"()V", (void*)&WB_FullGC }, 856 {CC"fullGC", CC"()V", (void*)&WB_FullGC },
689 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, 857 {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory },
690 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures }, 858 {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
691 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;", 859 {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
692 (void*)&WB_GetNMethod }, 860 (void*)&WB_GetNMethod },