comparison src/share/vm/prims/unsafe.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 1d7922586cf6
children d8ce2825b193
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
195 bool needs_barrier = false; 195 bool needs_barrier = false;
196 196
197 if (ret != NULL) { 197 if (ret != NULL) {
198 if (offset == java_lang_ref_Reference::referent_offset) { 198 if (offset == java_lang_ref_Reference::referent_offset) {
199 oop o = JNIHandles::resolve_non_null(obj); 199 oop o = JNIHandles::resolve_non_null(obj);
200 klassOop k = o->klass(); 200 Klass* k = o->klass();
201 if (instanceKlass::cast(k)->reference_type() != REF_NONE) { 201 if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
202 assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity"); 202 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
203 needs_barrier = true; 203 needs_barrier = true;
204 } 204 }
205 } 205 }
206 } 206 }
207 207
253 bool needs_barrier = false; 253 bool needs_barrier = false;
254 254
255 if (ret != NULL) { 255 if (ret != NULL) {
256 if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) { 256 if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) {
257 oop o = JNIHandles::resolve(obj); 257 oop o = JNIHandles::resolve(obj);
258 klassOop k = o->klass(); 258 Klass* k = o->klass();
259 if (instanceKlass::cast(k)->reference_type() != REF_NONE) { 259 if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
260 assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity"); 260 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
261 needs_barrier = true; 261 needs_barrier = true;
262 } 262 }
263 } 263 }
264 } 264 }
265 265
693 THROW_0(vmSymbols::java_lang_NullPointerException()); 693 THROW_0(vmSymbols::java_lang_NullPointerException());
694 } 694 }
695 695
696 oop reflected = JNIHandles::resolve_non_null(field); 696 oop reflected = JNIHandles::resolve_non_null(field);
697 oop mirror = java_lang_reflect_Field::clazz(reflected); 697 oop mirror = java_lang_reflect_Field::clazz(reflected);
698 klassOop k = java_lang_Class::as_klassOop(mirror); 698 Klass* k = java_lang_Class::as_Klass(mirror);
699 int slot = java_lang_reflect_Field::slot(reflected); 699 int slot = java_lang_reflect_Field::slot(reflected);
700 int modifiers = java_lang_reflect_Field::modifiers(reflected); 700 int modifiers = java_lang_reflect_Field::modifiers(reflected);
701 701
702 if (must_be_static >= 0) { 702 if (must_be_static >= 0) {
703 int really_is_static = ((modifiers & JVM_ACC_STATIC) != 0); 703 int really_is_static = ((modifiers & JVM_ACC_STATIC) != 0);
704 if (must_be_static != really_is_static) { 704 if (must_be_static != really_is_static) {
705 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); 705 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
706 } 706 }
707 } 707 }
708 708
709 int offset = instanceKlass::cast(k)->field_offset(slot); 709 int offset = InstanceKlass::cast(k)->field_offset(slot);
710 return field_offset_from_byte_offset(offset); 710 return field_offset_from_byte_offset(offset);
711 } 711 }
712 712
713 UNSAFE_ENTRY(jlong, Unsafe_ObjectFieldOffset(JNIEnv *env, jobject unsafe, jobject field)) 713 UNSAFE_ENTRY(jlong, Unsafe_ObjectFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
714 UnsafeWrapper("Unsafe_ObjectFieldOffset"); 714 UnsafeWrapper("Unsafe_ObjectFieldOffset");
766 if (clazz == NULL) { 766 if (clazz == NULL) {
767 THROW(vmSymbols::java_lang_NullPointerException()); 767 THROW(vmSymbols::java_lang_NullPointerException());
768 } 768 }
769 oop mirror = JNIHandles::resolve_non_null(clazz); 769 oop mirror = JNIHandles::resolve_non_null(clazz);
770 770
771 klassOop klass = java_lang_Class::as_klassOop(mirror); 771 Klass* klass = java_lang_Class::as_Klass(mirror);
772 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { 772 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
773 instanceKlass* k = instanceKlass::cast(klass); 773 InstanceKlass* k = InstanceKlass::cast(klass);
774 k->initialize(CHECK); 774 k->initialize(CHECK);
775 } 775 }
776 } 776 }
777 UNSAFE_END 777 UNSAFE_END
778 778
780 UnsafeWrapper("Unsafe_ShouldBeInitialized"); 780 UnsafeWrapper("Unsafe_ShouldBeInitialized");
781 if (clazz == NULL) { 781 if (clazz == NULL) {
782 THROW_(vmSymbols::java_lang_NullPointerException(), false); 782 THROW_(vmSymbols::java_lang_NullPointerException(), false);
783 } 783 }
784 oop mirror = JNIHandles::resolve_non_null(clazz); 784 oop mirror = JNIHandles::resolve_non_null(clazz);
785 klassOop klass = java_lang_Class::as_klassOop(mirror); 785 Klass* klass = java_lang_Class::as_Klass(mirror);
786 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { 786 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
787 return true; 787 return true;
788 } 788 }
789 return false; 789 return false;
790 } 790 }
793 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) { 793 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) {
794 if (acls == NULL) { 794 if (acls == NULL) {
795 THROW(vmSymbols::java_lang_NullPointerException()); 795 THROW(vmSymbols::java_lang_NullPointerException());
796 } 796 }
797 oop mirror = JNIHandles::resolve_non_null(acls); 797 oop mirror = JNIHandles::resolve_non_null(acls);
798 klassOop k = java_lang_Class::as_klassOop(mirror); 798 Klass* k = java_lang_Class::as_Klass(mirror);
799 if (k == NULL || !k->klass_part()->oop_is_array()) { 799 if (k == NULL || !k->oop_is_array()) {
800 THROW(vmSymbols::java_lang_InvalidClassException()); 800 THROW(vmSymbols::java_lang_InvalidClassException());
801 } else if (k->klass_part()->oop_is_objArray()) { 801 } else if (k->oop_is_objArray()) {
802 base = arrayOopDesc::base_offset_in_bytes(T_OBJECT); 802 base = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
803 scale = heapOopSize; 803 scale = heapOopSize;
804 } else if (k->klass_part()->oop_is_typeArray()) { 804 } else if (k->oop_is_typeArray()) {
805 typeArrayKlass* tak = typeArrayKlass::cast(k); 805 typeArrayKlass* tak = typeArrayKlass::cast(k);
806 base = tak->array_header_in_bytes(); 806 base = tak->array_header_in_bytes();
807 assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok"); 807 assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
808 scale = (1 << tak->log2_element_size()); 808 scale = (1 << tak->log2_element_size());
809 } else { 809 } else {
1037 if (!p->is_objArray()) 1037 if (!p->is_objArray())
1038 THROW_0(vmSymbols::java_lang_IllegalArgumentException()); 1038 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
1039 cp_patches_h = objArrayHandle(THREAD, (objArrayOop)p); 1039 cp_patches_h = objArrayHandle(THREAD, (objArrayOop)p);
1040 } 1040 }
1041 1041
1042 KlassHandle host_klass(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(host_class))); 1042 KlassHandle host_klass(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(host_class)));
1043 const char* host_source = host_klass->external_name(); 1043 const char* host_source = host_klass->external_name();
1044 Handle host_loader(THREAD, host_klass->class_loader()); 1044 Handle host_loader(THREAD, host_klass->class_loader());
1045 Handle host_domain(THREAD, host_klass->protection_domain()); 1045 Handle host_domain(THREAD, host_klass->protection_domain());
1046 1046
1047 GrowableArray<Handle>* cp_patches = NULL; 1047 GrowableArray<Handle>* cp_patches = NULL;
1061 ClassFileStream st(class_bytes, class_bytes_length, (char*) host_source); 1061 ClassFileStream st(class_bytes, class_bytes_length, (char*) host_source);
1062 1062
1063 instanceKlassHandle anon_klass; 1063 instanceKlassHandle anon_klass;
1064 { 1064 {
1065 Symbol* no_class_name = NULL; 1065 Symbol* no_class_name = NULL;
1066 klassOop anonk = SystemDictionary::parse_stream(no_class_name, 1066 Klass* anonk = SystemDictionary::parse_stream(no_class_name,
1067 host_loader, host_domain, 1067 host_loader, host_domain,
1068 &st, host_klass, cp_patches, 1068 &st, host_klass, cp_patches,
1069 CHECK_NULL); 1069 CHECK_NULL);
1070 if (anonk == NULL) return NULL; 1070 if (anonk == NULL) return NULL;
1071 anon_klass = instanceKlassHandle(THREAD, anonk); 1071 anon_klass = instanceKlassHandle(THREAD, anonk);
1154 UnsafeWrapper("Unsafe_CompareAndSwapObject"); 1154 UnsafeWrapper("Unsafe_CompareAndSwapObject");
1155 oop x = JNIHandles::resolve(x_h); 1155 oop x = JNIHandles::resolve(x_h);
1156 oop e = JNIHandles::resolve(e_h); 1156 oop e = JNIHandles::resolve(e_h);
1157 oop p = JNIHandles::resolve(obj); 1157 oop p = JNIHandles::resolve(obj);
1158 HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset); 1158 HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);
1159 if (UseCompressedOops) { 1159 oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e, true);
1160 update_barrier_set_pre((narrowOop*)addr, e);
1161 } else {
1162 update_barrier_set_pre((oop*)addr, e);
1163 }
1164 oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);
1165 jboolean success = (res == e); 1160 jboolean success = (res == e);
1166 if (success) 1161 if (success)
1167 update_barrier_set((void*)addr, x); 1162 update_barrier_set((void*)addr, x);
1168 return success; 1163 return success;
1169 UNSAFE_END 1164 UNSAFE_END