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++) { |