< 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


   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "gc/shared/collectedHeap.hpp"
  28 #include "memory/universe.hpp"

  29 #include "prims/jvmtiGetLoadedClasses.hpp"
  30 #include "runtime/jniHandles.inline.hpp"
  31 #include "runtime/thread.hpp"
  32 #include "utilities/stack.inline.hpp"
  33 #if INCLUDE_ALL_GCS
  34 #include "gc/g1/g1BarrierSet.hpp"
  35 #endif
  36 
  37 
  38 // The closure for GetLoadedClasses
  39 class LoadedClassesClosure : public KlassClosure {
  40 private:
  41   Stack<jclass, mtInternal> _classStack;
  42   JvmtiEnv* _env;
  43   Thread*   _cur_thread;
  44 
  45 // Tell the GC to keep this klass alive
  46 static void ensure_klass_alive(oop o) {
  47   // A klass that was previously considered dead can be looked up in the
  48   // CLD/SD, and its _java_mirror or _class_loader can be stored in a root
  49   // or a reachable object making it alive again. The SATB part of G1 needs
  50   // to get notified about this potential resurrection, otherwise the marking
  51   // might not find the object.
  52 #if INCLUDE_ALL_GCS
  53   if (UseG1GC && o != NULL) {
  54     G1BarrierSet::enqueue(o);
  55   }
  56 #endif
  57 }
  58 
  59 public:
  60   LoadedClassesClosure(Thread* thread, JvmtiEnv* env) : _cur_thread(thread), _env(env) {
  61     assert(_cur_thread == Thread::current(), "must be current thread");
  62   }
  63 
  64   void do_klass(Klass* k) {
  65     // Collect all jclasses
  66     _classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, k->java_mirror())));
  67     ensure_klass_alive(k->java_mirror());




  68   }
  69 
  70   int extract(jclass* result_list) {
  71     // The size of the Stack will be 0 after extract, so get it here
  72     int count = (int)_classStack.size();
  73     int i = count;
  74 
  75     // Pop all jclasses, fill backwards
  76     while (!_classStack.is_empty()) {
  77       result_list[--i] = _classStack.pop();
  78     }
  79 
  80     // Return the number of elements written
  81     return count;
  82   }
  83 
  84   // Return current size of the Stack
  85   int get_count() {
  86     return (int)_classStack.size();
  87   }




   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "gc/shared/collectedHeap.hpp"
  28 #include "memory/universe.hpp"
  29 #include "oops/access.inline.hpp"
  30 #include "prims/jvmtiGetLoadedClasses.hpp"
  31 #include "runtime/jniHandles.inline.hpp"
  32 #include "runtime/thread.hpp"
  33 #include "utilities/stack.inline.hpp"



  34 
  35 
  36 // The closure for GetLoadedClasses
  37 class LoadedClassesClosure : public KlassClosure {
  38 private:
  39   Stack<jclass, mtInternal> _classStack;
  40   JvmtiEnv* _env;
  41   Thread*   _cur_thread;
  42 














  43 public:
  44   LoadedClassesClosure(Thread* thread, JvmtiEnv* env) : _cur_thread(thread), _env(env) {
  45     assert(_cur_thread == Thread::current(), "must be current thread");
  46   }
  47 
  48   void do_klass(Klass* k) {
  49     // Collect all jclasses
  50     // A klass that was previously considered dead can be looked up in the
  51     // CLD/SD, and its _java_mirror or _class_loader can be stored in a root
  52     // or a reachable object making it alive again. We must get the mirror via RootAccess,
  53     // with ON_PHANTOM_OOP_REF to ensure that (SATB) GCs mark the mirror alive.
  54     oop mirror = RootAccess<ON_PHANTOM_OOP_REF>::oop_load(k->java_mirror_handle().ptr_raw());
  55     _classStack.push((jclass) _env->jni_reference(Handle(_cur_thread, mirror)));
  56   }
  57 
  58   int extract(jclass* result_list) {
  59     // The size of the Stack will be 0 after extract, so get it here
  60     int count = (int)_classStack.size();
  61     int i = count;
  62 
  63     // Pop all jclasses, fill backwards
  64     while (!_classStack.is_empty()) {
  65       result_list[--i] = _classStack.pop();
  66     }
  67 
  68     // Return the number of elements written
  69     return count;
  70   }
  71 
  72   // Return current size of the Stack
  73   int get_count() {
  74     return (int)_classStack.size();
  75   }


< prev index next >