src/share/vm/memory/iterator.hpp

changeset 1424
148e5441d916
parent 791
1ee8caae33af
child 1428
54b3b351d6f9
     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  

mercurial