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/growableArray.hpp" 35 36 37 // Keep track of marked on-stack metadata so it can be cleared. 38 GrowableArray<Metadata*>* _marked_objects = NULL; 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() { 45 assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); 46 NOT_PRODUCT(_is_active = true;) 47 if (_marked_objects == NULL) { 48 _marked_objects = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(1000, true); 49 } 50 51 Threads::metadata_do(Metadata::mark_on_stack); 52 if (JvmtiExport::has_redefined_a_class()) { 53 CodeCache::alive_nmethods_do(nmethod::mark_on_stack); 54 } 55 CompileBroker::mark_on_stack(); 56 JvmtiCurrentBreakpoints::metadata_do(Metadata::mark_on_stack); 57 ThreadService::metadata_do(Metadata::mark_on_stack); 58 } 59 60 MetadataOnStackMark::~MetadataOnStackMark() { 61 assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); 62 // Unmark everything that was marked. Can't do the same walk because 63 // redefine classes messes up the code cache so the set of methods 64 // might not be the same. 65 for (int i = 0; i< _marked_objects->length(); i++) { 66 _marked_objects->at(i)->set_on_stack(false); 67 } 68 _marked_objects->clear(); // reuse growable array for next time. 69 NOT_PRODUCT(_is_active = false;) 70 } 71 72 // Record which objects are marked so we can unmark the same objects. | 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/growableArray.hpp" 35 36 37 // Keep track of marked on-stack metadata so it can be cleared. 38 GrowableArray<Metadata*>* _marked_objects = NULL; 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 NOT_PRODUCT(_is_active = true;) 47 if (_marked_objects == NULL) { 48 _marked_objects = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(1000, true); 49 } 50 51 Threads::metadata_do(Metadata::mark_on_stack); 52 if (has_redefined_a_class) { 53 CodeCache::alive_nmethods_do(nmethod::mark_on_stack); 54 } 55 CompileBroker::mark_on_stack(); 56 JvmtiCurrentBreakpoints::metadata_do(Metadata::mark_on_stack); 57 ThreadService::metadata_do(Metadata::mark_on_stack); 58 } 59 60 MetadataOnStackMark::~MetadataOnStackMark() { 61 assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); 62 // Unmark everything that was marked. Can't do the same walk because 63 // redefine classes messes up the code cache so the set of methods 64 // might not be the same. 65 for (int i = 0; i< _marked_objects->length(); i++) { 66 _marked_objects->at(i)->set_on_stack(false); 67 } 68 _marked_objects->clear(); // reuse growable array for next time. 69 NOT_PRODUCT(_is_active = false;) 70 } 71 72 // Record which objects are marked so we can unmark the same objects. |