< prev index next >

src/share/vm/classfile/metadataOnStackMark.cpp

Print this page




  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/metadataOnStackMark.hpp"
  27 #include "code/codeCache.hpp"
  28 #include "compiler/compileBroker.hpp"
  29 #include "oops/metadata.hpp"
  30 #include "prims/jvmtiImpl.hpp"
  31 #include "runtime/synchronizer.hpp"
  32 #include "runtime/thread.hpp"
  33 #include "services/threadService.hpp"
  34 #include "utilities/chunkedList.hpp"
  35 
  36 volatile MetadataOnStackBuffer* MetadataOnStackMark::_used_buffers = NULL;
  37 volatile MetadataOnStackBuffer* MetadataOnStackMark::_free_buffers = NULL;
  38 
  39 NOT_PRODUCT(bool MetadataOnStackMark::_is_active = false;)
  40 
  41 // Walk metadata on the stack and mark it so that redefinition doesn't delete
  42 // it.  Class unloading also walks the previous versions and might try to
  43 // delete it, so this class is used by class unloading also.
  44 MetadataOnStackMark::MetadataOnStackMark(bool visit_code_cache) {
  45   assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
  46   assert(_used_buffers == NULL, "sanity check");
  47   NOT_PRODUCT(_is_active = true;)
  48 
  49   Threads::metadata_do(Metadata::mark_on_stack);
  50   if (visit_code_cache) {
  51     CodeCache::alive_nmethods_do(nmethod::mark_on_stack);
  52   }
  53   CompileBroker::mark_on_stack();
  54   JvmtiCurrentBreakpoints::metadata_do(Metadata::mark_on_stack);
  55   ThreadService::metadata_do(Metadata::mark_on_stack);
  56 }
  57 
  58 MetadataOnStackMark::~MetadataOnStackMark() {
  59   assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
  60   // Unmark everything that was marked.   Can't do the same walk because
  61   // redefine classes messes up the code cache so the set of methods
  62   // might not be the same.
  63 
  64   retire_buffer_for_thread(Thread::current());
  65 
  66   MetadataOnStackBuffer* buffer = const_cast<MetadataOnStackBuffer* >(_used_buffers);
  67   while (buffer != NULL) {
  68     // Clear on stack state for all metadata.
  69     size_t size = buffer->size();
  70     for (size_t i  = 0; i < size; i++) {




  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/metadataOnStackMark.hpp"
  27 #include "code/codeCache.hpp"
  28 #include "compiler/compileBroker.hpp"
  29 #include "oops/metadata.hpp"
  30 #include "prims/jvmtiImpl.hpp"
  31 #include "runtime/synchronizer.hpp"
  32 #include "runtime/thread.hpp"
  33 #include "services/threadService.hpp"
  34 #include "utilities/chunkedList.hpp"
  35 
  36 volatile MetadataOnStackBuffer* MetadataOnStackMark::_used_buffers = NULL;
  37 volatile MetadataOnStackBuffer* MetadataOnStackMark::_free_buffers = NULL;
  38 
  39 NOT_PRODUCT(bool MetadataOnStackMark::_is_active = false;)
  40 
  41 // Walk metadata on the stack and mark it so that redefinition doesn't delete
  42 // it.  Class unloading also walks the previous versions and might try to
  43 // delete it, so this class is used by class unloading also.
  44 MetadataOnStackMark::MetadataOnStackMark(bool has_redefined_a_class) {
  45   assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
  46   assert(_used_buffers == NULL, "sanity check");
  47   NOT_PRODUCT(_is_active = true;)
  48 
  49   Threads::metadata_do(Metadata::mark_on_stack);
  50   if (has_redefined_a_class) {
  51     CodeCache::alive_nmethods_do(nmethod::mark_on_stack);
  52   }
  53   CompileBroker::mark_on_stack();
  54   JvmtiCurrentBreakpoints::metadata_do(Metadata::mark_on_stack);
  55   ThreadService::metadata_do(Metadata::mark_on_stack);
  56 }
  57 
  58 MetadataOnStackMark::~MetadataOnStackMark() {
  59   assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
  60   // Unmark everything that was marked.   Can't do the same walk because
  61   // redefine classes messes up the code cache so the set of methods
  62   // might not be the same.
  63 
  64   retire_buffer_for_thread(Thread::current());
  65 
  66   MetadataOnStackBuffer* buffer = const_cast<MetadataOnStackBuffer* >(_used_buffers);
  67   while (buffer != NULL) {
  68     // Clear on stack state for all metadata.
  69     size_t size = buffer->size();
  70     for (size_t i  = 0; i < size; i++) {


< prev index next >