src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp

changeset 1280
df6caf649ff7
parent 777
37f87013dfd8
child 1907
c18cbe5936b8
     1.1 --- a/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp	Fri Jul 10 16:01:20 2009 -0700
     1.2 +++ b/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp	Tue Jul 14 15:40:39 2009 -0700
     1.3 @@ -42,35 +42,40 @@
     1.4      BufferLength = 1024
     1.5    };
     1.6  
     1.7 -  oop          *_buffer[BufferLength];
     1.8 -  oop         **_buffer_top;
     1.9 -  oop         **_buffer_curr;
    1.10 +  StarTask  _buffer[BufferLength];
    1.11 +  StarTask* _buffer_top;
    1.12 +  StarTask* _buffer_curr;
    1.13  
    1.14 -  OopClosure  *_oc;
    1.15 -  double       _closure_app_seconds;
    1.16 +  OopClosure* _oc;
    1.17 +  double      _closure_app_seconds;
    1.18  
    1.19    void process_buffer () {
    1.20 -
    1.21      double start = os::elapsedTime();
    1.22 -    for (oop **curr = _buffer; curr < _buffer_curr; ++curr) {
    1.23 -      _oc->do_oop(*curr);
    1.24 +    for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
    1.25 +      if (curr->is_narrow()) {
    1.26 +        assert(UseCompressedOops, "Error");
    1.27 +        _oc->do_oop((narrowOop*)(*curr));
    1.28 +      } else {
    1.29 +        _oc->do_oop((oop*)(*curr));
    1.30 +      }
    1.31      }
    1.32      _buffer_curr = _buffer;
    1.33      _closure_app_seconds += (os::elapsedTime() - start);
    1.34    }
    1.35  
    1.36 -public:
    1.37 -  virtual void do_oop(narrowOop* p) {
    1.38 -    guarantee(false, "NYI");
    1.39 -  }
    1.40 -  virtual void do_oop(oop *p) {
    1.41 +  template <class T> inline void do_oop_work(T* p) {
    1.42      if (_buffer_curr == _buffer_top) {
    1.43        process_buffer();
    1.44      }
    1.45 -
    1.46 -    *_buffer_curr = p;
    1.47 +    StarTask new_ref(p);
    1.48 +    *_buffer_curr = new_ref;
    1.49      ++_buffer_curr;
    1.50    }
    1.51 +
    1.52 +public:
    1.53 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    1.54 +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    1.55 +
    1.56    void done () {
    1.57      if (_buffer_curr > _buffer) {
    1.58        process_buffer();
    1.59 @@ -88,18 +93,17 @@
    1.60  class BufferingOopsInGenClosure: public OopsInGenClosure {
    1.61    BufferingOopClosure _boc;
    1.62    OopsInGenClosure* _oc;
    1.63 -public:
    1.64 + protected:
    1.65 +  template <class T> inline void do_oop_work(T* p) {
    1.66 +    assert(generation()->is_in_reserved((void*)p), "Must be in!");
    1.67 +    _boc.do_oop(p);
    1.68 +  }
    1.69 + public:
    1.70    BufferingOopsInGenClosure(OopsInGenClosure *oc) :
    1.71      _boc(oc), _oc(oc) {}
    1.72  
    1.73 -  virtual void do_oop(narrowOop* p) {
    1.74 -    guarantee(false, "NYI");
    1.75 -  }
    1.76 -
    1.77 -  virtual void do_oop(oop* p) {
    1.78 -    assert(generation()->is_in_reserved(p), "Must be in!");
    1.79 -    _boc.do_oop(p);
    1.80 -  }
    1.81 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
    1.82 +  virtual void do_oop(oop* p)       { do_oop_work(p); }
    1.83  
    1.84    void done() {
    1.85      _boc.done();
    1.86 @@ -130,14 +134,14 @@
    1.87      BufferLength = 1024
    1.88    };
    1.89  
    1.90 -  oop                      *_buffer[BufferLength];
    1.91 -  oop                     **_buffer_top;
    1.92 -  oop                     **_buffer_curr;
    1.93 +  StarTask     _buffer[BufferLength];
    1.94 +  StarTask*    _buffer_top;
    1.95 +  StarTask*    _buffer_curr;
    1.96  
    1.97 -  HeapRegion               *_hr_buffer[BufferLength];
    1.98 -  HeapRegion              **_hr_curr;
    1.99 +  HeapRegion*  _hr_buffer[BufferLength];
   1.100 +  HeapRegion** _hr_curr;
   1.101  
   1.102 -  OopsInHeapRegionClosure  *_oc;
   1.103 +  OopsInHeapRegionClosure*  _oc;
   1.104    double                    _closure_app_seconds;
   1.105  
   1.106    void process_buffer () {
   1.107 @@ -146,15 +150,20 @@
   1.108             "the two lengths should be the same");
   1.109  
   1.110      double start = os::elapsedTime();
   1.111 -    HeapRegion **hr_curr = _hr_buffer;
   1.112 -    HeapRegion *hr_prev = NULL;
   1.113 -    for (oop **curr = _buffer; curr < _buffer_curr; ++curr) {
   1.114 -      HeapRegion *region = *hr_curr;
   1.115 +    HeapRegion** hr_curr = _hr_buffer;
   1.116 +    HeapRegion*  hr_prev = NULL;
   1.117 +    for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
   1.118 +      HeapRegion* region = *hr_curr;
   1.119        if (region != hr_prev) {
   1.120          _oc->set_region(region);
   1.121          hr_prev = region;
   1.122        }
   1.123 -      _oc->do_oop(*curr);
   1.124 +      if (curr->is_narrow()) {
   1.125 +        assert(UseCompressedOops, "Error");
   1.126 +        _oc->do_oop((narrowOop*)(*curr));
   1.127 +      } else {
   1.128 +        _oc->do_oop((oop*)(*curr));
   1.129 +      }
   1.130        ++hr_curr;
   1.131      }
   1.132      _buffer_curr = _buffer;
   1.133 @@ -163,17 +172,16 @@
   1.134    }
   1.135  
   1.136  public:
   1.137 -  virtual void do_oop(narrowOop *p) {
   1.138 -    guarantee(false, "NYI");
   1.139 -  }
   1.140 +  virtual void do_oop(narrowOop* p) { do_oop_work(p); }
   1.141 +  virtual void do_oop(      oop* p) { do_oop_work(p); }
   1.142  
   1.143 -  virtual void do_oop(oop *p) {
   1.144 +  template <class T> void do_oop_work(T* p) {
   1.145      if (_buffer_curr == _buffer_top) {
   1.146        assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
   1.147        process_buffer();
   1.148      }
   1.149 -
   1.150 -    *_buffer_curr = p;
   1.151 +    StarTask new_ref(p);
   1.152 +    *_buffer_curr = new_ref;
   1.153      ++_buffer_curr;
   1.154      *_hr_curr = _from;
   1.155      ++_hr_curr;

mercurial