1.1 --- a/src/share/vm/memory/iterator.hpp Tue Sep 15 11:09:34 2009 -0700 1.2 +++ b/src/share/vm/memory/iterator.hpp Tue Sep 15 21:53:47 2009 -0700 1.3 @@ -24,6 +24,7 @@ 1.4 1.5 // The following classes are C++ `closures` for iterating over objects, roots and spaces 1.6 1.7 +class CodeBlob; 1.8 class ReferenceProcessor; 1.9 1.10 // Closure provides abortability. 1.11 @@ -57,9 +58,6 @@ 1.12 virtual const bool should_remember_klasses() const { return false; } 1.13 virtual void remember_klass(Klass* k) { /* do nothing */ } 1.14 1.15 - // If "true", invoke on nmethods (when scanning compiled frames). 1.16 - virtual const bool do_nmethods() const { return false; } 1.17 - 1.18 // The methods below control how object iterations invoking this closure 1.19 // should be performed: 1.20 1.21 @@ -158,6 +156,51 @@ 1.22 }; 1.23 1.24 1.25 +// CodeBlobClosure is used for iterating through code blobs 1.26 +// in the code cache or on thread stacks 1.27 + 1.28 +class CodeBlobClosure : public Closure { 1.29 + public: 1.30 + // Called for each code blob. 1.31 + virtual void do_code_blob(CodeBlob* cb) = 0; 1.32 +}; 1.33 + 1.34 + 1.35 +class MarkingCodeBlobClosure : public CodeBlobClosure { 1.36 + public: 1.37 + // Called for each code blob, but at most once per unique blob. 1.38 + virtual void do_newly_marked_nmethod(CodeBlob* cb) = 0; 1.39 + 1.40 + virtual void do_code_blob(CodeBlob* cb); 1.41 + // = { if (!nmethod(cb)->test_set_oops_do_mark()) do_newly_marked_nmethod(cb); } 1.42 + 1.43 + class MarkScope : public StackObj { 1.44 + protected: 1.45 + bool _active; 1.46 + public: 1.47 + MarkScope(bool activate = true); 1.48 + // = { if (active) nmethod::oops_do_marking_prologue(); } 1.49 + ~MarkScope(); 1.50 + // = { if (active) nmethod::oops_do_marking_epilogue(); } 1.51 + }; 1.52 +}; 1.53 + 1.54 + 1.55 +// Applies an oop closure to all ref fields in code blobs 1.56 +// iterated over in an object iteration. 1.57 +class CodeBlobToOopClosure: public MarkingCodeBlobClosure { 1.58 + OopClosure* _cl; 1.59 + bool _do_marking; 1.60 +public: 1.61 + virtual void do_newly_marked_nmethod(CodeBlob* cb); 1.62 + // = { cb->oops_do(_cl); } 1.63 + virtual void do_code_blob(CodeBlob* cb); 1.64 + // = { if (_do_marking) super::do_code_blob(cb); else cb->oops_do(_cl); } 1.65 + CodeBlobToOopClosure(OopClosure* cl, bool do_marking) 1.66 + : _cl(cl), _do_marking(do_marking) {} 1.67 +}; 1.68 + 1.69 + 1.70 1.71 // MonitorClosure is used for iterating over monitors in the monitors cache 1.72