< prev index next >
src/hotspot/share/prims/jvmtiGetLoadedClasses.cpp
Print this page
rev 49232 : 8199612: Replace remaining uses of G1BarrierSet::enqueue() with appropriate Access API calls
*** 24,72 ****
#include "precompiled.hpp"
#include "classfile/systemDictionary.hpp"
#include "gc/shared/collectedHeap.hpp"
#include "memory/universe.hpp"
#include "prims/jvmtiGetLoadedClasses.hpp"
#include "runtime/jniHandles.inline.hpp"
#include "runtime/thread.hpp"
#include "utilities/stack.inline.hpp"
- #if INCLUDE_ALL_GCS
- #include "gc/g1/g1BarrierSet.hpp"
- #endif
// The closure for GetLoadedClasses
class LoadedClassesClosure : public KlassClosure {
private:
Stack<jclass, mtInternal> _classStack;
JvmtiEnv* _env;
Thread* _cur_thread;
- // Tell the GC to keep this klass alive
- static void ensure_klass_alive(oop o) {
- // A klass that was previously considered dead can be looked up in the
- // CLD/SD, and its _java_mirror or _class_loader can be stored in a root
- // or a reachable object making it alive again. The SATB part of G1 needs
- // to get notified about this potential resurrection, otherwise the marking
- // might not find the object.
- #if INCLUDE_ALL_GCS
- if (UseG1GC && o != NULL) {
- G1BarrierSet::enqueue(o);
- }
- #endif
- }
-
public:
LoadedClassesClosure(Thread* thread, JvmtiEnv* env) : _cur_thread(thread), _env(env) {
assert(_cur_thread == Thread::current(), "must be current thread");
}
void do_klass(Klass* k) {
// Collect all jclasses
! _classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, k->java_mirror())));
! ensure_klass_alive(k->java_mirror());
}
int extract(jclass* result_list) {
// The size of the Stack will be 0 after extract, so get it here
int count = (int)_classStack.size();
--- 24,60 ----
#include "precompiled.hpp"
#include "classfile/systemDictionary.hpp"
#include "gc/shared/collectedHeap.hpp"
#include "memory/universe.hpp"
+ #include "oops/access.inline.hpp"
#include "prims/jvmtiGetLoadedClasses.hpp"
#include "runtime/jniHandles.inline.hpp"
#include "runtime/thread.hpp"
#include "utilities/stack.inline.hpp"
// The closure for GetLoadedClasses
class LoadedClassesClosure : public KlassClosure {
private:
Stack<jclass, mtInternal> _classStack;
JvmtiEnv* _env;
Thread* _cur_thread;
public:
LoadedClassesClosure(Thread* thread, JvmtiEnv* env) : _cur_thread(thread), _env(env) {
assert(_cur_thread == Thread::current(), "must be current thread");
}
void do_klass(Klass* k) {
// Collect all jclasses
! // A klass that was previously considered dead can be looked up in the
! // CLD/SD, and its _java_mirror or _class_loader can be stored in a root
! // or a reachable object making it alive again. We must get the mirror via RootAccess,
! // with ON_PHANTOM_OOP_REF to ensure that (SATB) GCs mark the mirror alive.
! oop mirror = RootAccess<ON_PHANTOM_OOP_REF>::oop_load(k->java_mirror_handle().ptr_raw());
! _classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, mirror)));
}
int extract(jclass* result_list) {
// The size of the Stack will be 0 after extract, so get it here
int count = (int)_classStack.size();
< prev index next >