< prev index next >
src/share/vm/oops/klass.cpp
Print this page
rev 12906 : [mq]: gc_interface
*** 34,51 ****
#include "memory/oopFactory.hpp"
#include "memory/resourceArea.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/klass.inline.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/atomic.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "trace/traceMacros.hpp"
#include "utilities/macros.hpp"
#include "utilities/stack.inline.hpp"
- #if INCLUDE_ALL_GCS
- #include "gc/g1/g1SATBCardTableModRefBS.hpp"
- #endif // INCLUDE_ALL_GCS
bool Klass::is_cloneable() const {
return _access_flags.is_cloneable_fast() ||
is_subtype_of(SystemDictionary::Cloneable_klass());
}
--- 34,49 ----
#include "memory/oopFactory.hpp"
#include "memory/resourceArea.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/klass.inline.hpp"
#include "oops/oop.inline.hpp"
+ #include "runtime/access.inline.hpp"
#include "runtime/atomic.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "trace/traceMacros.hpp"
#include "utilities/macros.hpp"
#include "utilities/stack.inline.hpp"
bool Klass::is_cloneable() const {
return _access_flags.is_cloneable_fast() ||
is_subtype_of(SystemDictionary::Cloneable_klass());
}
*** 438,486 ****
}
}
}
}
! void Klass::klass_update_barrier_set(oop v) {
! record_modified_oops();
! }
!
! // This barrier is used by G1 to remember the old oop values, so
! // that we don't forget any objects that were live at the snapshot at
! // the beginning. This function is only used when we write oops into Klasses.
! void Klass::klass_update_barrier_set_pre(oop* p, oop v) {
! #if INCLUDE_ALL_GCS
! if (UseG1GC) {
! oop obj = *p;
! if (obj != NULL) {
! G1SATBCardTableModRefBS::enqueue(obj);
! }
! }
! #endif
! }
!
! void Klass::klass_oop_store(oop* p, oop v) {
! assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
! assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object");
!
! // do the store
! if (always_do_update_barrier) {
! klass_oop_store((volatile oop*)p, v);
! } else {
! klass_update_barrier_set_pre(p, v);
! *p = v;
! klass_update_barrier_set(v);
! }
! }
!
! void Klass::klass_oop_store(volatile oop* p, oop v) {
! assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
! assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object");
!
! klass_update_barrier_set_pre((oop*)p, v); // Cast away volatile.
! OrderAccess::release_store_ptr(p, v);
! klass_update_barrier_set(v);
}
void Klass::oops_do(OopClosure* cl) {
cl->do_oop(&_java_mirror);
}
--- 436,447 ----
}
}
}
}
! void Klass::set_java_mirror(oop m) {
! KlassAccess<MO_RELEASE>::oop_store_at(this, in_bytes(java_mirror_offset()), m);
}
void Klass::oops_do(OopClosure* cl) {
cl->do_oop(&_java_mirror);
}
*** 565,574 ****
--- 526,543 ----
return NULL;
}
oop Klass::class_loader() const { return class_loader_data()->class_loader(); }
+ oop* Klass::klass_holder_addr() const {
+ return class_loader_data()->class_loader_addr();
+ }
+
+ oop Klass::klass_holder() const {
+ return RootAccess<GC_ACCESS_ON_PHANTOM>::oop_load(klass_holder_addr());
+ }
+
// In product mode, this function doesn't have virtual function calls so
// there might be some performance advantage to handling InstanceKlass here.
const char* Klass::external_name() const {
if (is_instance_klass()) {
const InstanceKlass* ik = static_cast<const InstanceKlass*>(this);
< prev index next >