2822 // 2823 2824 // hash_code_ptr - pre-checked for NULL 2825 jvmtiError 2826 JvmtiEnv::GetObjectHashCode(jobject object, jint* hash_code_ptr) { 2827 oop mirror = JNIHandles::resolve_external_guard(object); 2828 NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT); 2829 NULL_CHECK(hash_code_ptr, JVMTI_ERROR_NULL_POINTER); 2830 2831 { 2832 jint result = (jint) mirror->identity_hash(); 2833 *hash_code_ptr = result; 2834 } 2835 return JVMTI_ERROR_NONE; 2836 } /* end GetObjectHashCode */ 2837 2838 2839 // info_ptr - pre-checked for NULL 2840 jvmtiError 2841 JvmtiEnv::GetObjectMonitorUsage(jobject object, jvmtiMonitorUsage* info_ptr) { 2842 JavaThread* calling_thread = JavaThread::current(); 2843 jvmtiError err = get_object_monitor_usage(calling_thread, object, info_ptr); 2844 if (err == JVMTI_ERROR_THREAD_NOT_SUSPENDED) { 2845 // Some of the critical threads were not suspended. go to a safepoint and try again 2846 VM_GetObjectMonitorUsage op(this, calling_thread, object, info_ptr); 2847 VMThread::execute(&op); 2848 err = op.result(); 2849 } 2850 return err; 2851 } /* end GetObjectMonitorUsage */ 2852 2853 2854 // 2855 // Field functions 2856 // 2857 2858 // name_ptr - NULL is a valid value, must be checked 2859 // signature_ptr - NULL is a valid value, must be checked 2860 // generic_ptr - NULL is a valid value, must be checked 2861 jvmtiError 2862 JvmtiEnv::GetFieldName(fieldDescriptor* fdesc_ptr, char** name_ptr, char** signature_ptr, char** generic_ptr) { 2863 JavaThread* current_thread = JavaThread::current(); 2864 ResourceMark rm(current_thread); 2865 if (name_ptr == NULL) { 2866 // just don't return the name 2867 } else { 2868 const char* fieldName = fdesc_ptr->name()->as_C_string(); 2869 *name_ptr = (char*) jvmtiMalloc(strlen(fieldName) + 1); 2870 if (*name_ptr == NULL) | 2822 // 2823 2824 // hash_code_ptr - pre-checked for NULL 2825 jvmtiError 2826 JvmtiEnv::GetObjectHashCode(jobject object, jint* hash_code_ptr) { 2827 oop mirror = JNIHandles::resolve_external_guard(object); 2828 NULL_CHECK(mirror, JVMTI_ERROR_INVALID_OBJECT); 2829 NULL_CHECK(hash_code_ptr, JVMTI_ERROR_NULL_POINTER); 2830 2831 { 2832 jint result = (jint) mirror->identity_hash(); 2833 *hash_code_ptr = result; 2834 } 2835 return JVMTI_ERROR_NONE; 2836 } /* end GetObjectHashCode */ 2837 2838 2839 // info_ptr - pre-checked for NULL 2840 jvmtiError 2841 JvmtiEnv::GetObjectMonitorUsage(jobject object, jvmtiMonitorUsage* info_ptr) { 2842 // This needs to be performed at a safepoint to gather stable data 2843 // because monitor owner / waiters might not be suspended. 2844 VM_GetObjectMonitorUsage op(this, JavaThread::current(), object, info_ptr); 2845 VMThread::execute(&op); 2846 return op.result(); 2847 } /* end GetObjectMonitorUsage */ 2848 2849 2850 // 2851 // Field functions 2852 // 2853 2854 // name_ptr - NULL is a valid value, must be checked 2855 // signature_ptr - NULL is a valid value, must be checked 2856 // generic_ptr - NULL is a valid value, must be checked 2857 jvmtiError 2858 JvmtiEnv::GetFieldName(fieldDescriptor* fdesc_ptr, char** name_ptr, char** signature_ptr, char** generic_ptr) { 2859 JavaThread* current_thread = JavaThread::current(); 2860 ResourceMark rm(current_thread); 2861 if (name_ptr == NULL) { 2862 // just don't return the name 2863 } else { 2864 const char* fieldName = fdesc_ptr->name()->as_C_string(); 2865 *name_ptr = (char*) jvmtiMalloc(strlen(fieldName) + 1); 2866 if (*name_ptr == NULL) |