< 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,49 +24,37 @@
 
 #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"
-#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());
+    // 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 >