comparison src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp @ 845:df6caf649ff7

6700789: G1: Enable use of compressed oops with G1 heaps Summary: Modifications to G1 so as to allow the use of compressed oops. Reviewed-by: apetrusenko, coleenp, jmasa, kvn, never, phh, tonyp
author ysr
date Tue, 14 Jul 2009 15:40:39 -0700
parents 37f87013dfd8
children c18cbe5936b8
comparison
equal deleted inserted replaced
839:bb18957ad21e 845:df6caf649ff7
40 protected: 40 protected:
41 enum PrivateConstants { 41 enum PrivateConstants {
42 BufferLength = 1024 42 BufferLength = 1024
43 }; 43 };
44 44
45 oop *_buffer[BufferLength]; 45 StarTask _buffer[BufferLength];
46 oop **_buffer_top; 46 StarTask* _buffer_top;
47 oop **_buffer_curr; 47 StarTask* _buffer_curr;
48 48
49 OopClosure *_oc; 49 OopClosure* _oc;
50 double _closure_app_seconds; 50 double _closure_app_seconds;
51 51
52 void process_buffer () { 52 void process_buffer () {
53
54 double start = os::elapsedTime(); 53 double start = os::elapsedTime();
55 for (oop **curr = _buffer; curr < _buffer_curr; ++curr) { 54 for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
56 _oc->do_oop(*curr); 55 if (curr->is_narrow()) {
56 assert(UseCompressedOops, "Error");
57 _oc->do_oop((narrowOop*)(*curr));
58 } else {
59 _oc->do_oop((oop*)(*curr));
60 }
57 } 61 }
58 _buffer_curr = _buffer; 62 _buffer_curr = _buffer;
59 _closure_app_seconds += (os::elapsedTime() - start); 63 _closure_app_seconds += (os::elapsedTime() - start);
60 } 64 }
61 65
66 template <class T> inline void do_oop_work(T* p) {
67 if (_buffer_curr == _buffer_top) {
68 process_buffer();
69 }
70 StarTask new_ref(p);
71 *_buffer_curr = new_ref;
72 ++_buffer_curr;
73 }
74
62 public: 75 public:
63 virtual void do_oop(narrowOop* p) { 76 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
64 guarantee(false, "NYI"); 77 virtual void do_oop(oop* p) { do_oop_work(p); }
65 } 78
66 virtual void do_oop(oop *p) {
67 if (_buffer_curr == _buffer_top) {
68 process_buffer();
69 }
70
71 *_buffer_curr = p;
72 ++_buffer_curr;
73 }
74 void done () { 79 void done () {
75 if (_buffer_curr > _buffer) { 80 if (_buffer_curr > _buffer) {
76 process_buffer(); 81 process_buffer();
77 } 82 }
78 } 83 }
86 }; 91 };
87 92
88 class BufferingOopsInGenClosure: public OopsInGenClosure { 93 class BufferingOopsInGenClosure: public OopsInGenClosure {
89 BufferingOopClosure _boc; 94 BufferingOopClosure _boc;
90 OopsInGenClosure* _oc; 95 OopsInGenClosure* _oc;
91 public: 96 protected:
97 template <class T> inline void do_oop_work(T* p) {
98 assert(generation()->is_in_reserved((void*)p), "Must be in!");
99 _boc.do_oop(p);
100 }
101 public:
92 BufferingOopsInGenClosure(OopsInGenClosure *oc) : 102 BufferingOopsInGenClosure(OopsInGenClosure *oc) :
93 _boc(oc), _oc(oc) {} 103 _boc(oc), _oc(oc) {}
94 104
95 virtual void do_oop(narrowOop* p) { 105 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
96 guarantee(false, "NYI"); 106 virtual void do_oop(oop* p) { do_oop_work(p); }
97 }
98
99 virtual void do_oop(oop* p) {
100 assert(generation()->is_in_reserved(p), "Must be in!");
101 _boc.do_oop(p);
102 }
103 107
104 void done() { 108 void done() {
105 _boc.done(); 109 _boc.done();
106 } 110 }
107 111
128 private: 132 private:
129 enum PrivateConstants { 133 enum PrivateConstants {
130 BufferLength = 1024 134 BufferLength = 1024
131 }; 135 };
132 136
133 oop *_buffer[BufferLength]; 137 StarTask _buffer[BufferLength];
134 oop **_buffer_top; 138 StarTask* _buffer_top;
135 oop **_buffer_curr; 139 StarTask* _buffer_curr;
136 140
137 HeapRegion *_hr_buffer[BufferLength]; 141 HeapRegion* _hr_buffer[BufferLength];
138 HeapRegion **_hr_curr; 142 HeapRegion** _hr_curr;
139 143
140 OopsInHeapRegionClosure *_oc; 144 OopsInHeapRegionClosure* _oc;
141 double _closure_app_seconds; 145 double _closure_app_seconds;
142 146
143 void process_buffer () { 147 void process_buffer () {
144 148
145 assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer), 149 assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer),
146 "the two lengths should be the same"); 150 "the two lengths should be the same");
147 151
148 double start = os::elapsedTime(); 152 double start = os::elapsedTime();
149 HeapRegion **hr_curr = _hr_buffer; 153 HeapRegion** hr_curr = _hr_buffer;
150 HeapRegion *hr_prev = NULL; 154 HeapRegion* hr_prev = NULL;
151 for (oop **curr = _buffer; curr < _buffer_curr; ++curr) { 155 for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) {
152 HeapRegion *region = *hr_curr; 156 HeapRegion* region = *hr_curr;
153 if (region != hr_prev) { 157 if (region != hr_prev) {
154 _oc->set_region(region); 158 _oc->set_region(region);
155 hr_prev = region; 159 hr_prev = region;
156 } 160 }
157 _oc->do_oop(*curr); 161 if (curr->is_narrow()) {
162 assert(UseCompressedOops, "Error");
163 _oc->do_oop((narrowOop*)(*curr));
164 } else {
165 _oc->do_oop((oop*)(*curr));
166 }
158 ++hr_curr; 167 ++hr_curr;
159 } 168 }
160 _buffer_curr = _buffer; 169 _buffer_curr = _buffer;
161 _hr_curr = _hr_buffer; 170 _hr_curr = _hr_buffer;
162 _closure_app_seconds += (os::elapsedTime() - start); 171 _closure_app_seconds += (os::elapsedTime() - start);
163 } 172 }
164 173
165 public: 174 public:
166 virtual void do_oop(narrowOop *p) { 175 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
167 guarantee(false, "NYI"); 176 virtual void do_oop( oop* p) { do_oop_work(p); }
168 } 177
169 178 template <class T> void do_oop_work(T* p) {
170 virtual void do_oop(oop *p) {
171 if (_buffer_curr == _buffer_top) { 179 if (_buffer_curr == _buffer_top) {
172 assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr"); 180 assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr");
173 process_buffer(); 181 process_buffer();
174 } 182 }
175 183 StarTask new_ref(p);
176 *_buffer_curr = p; 184 *_buffer_curr = new_ref;
177 ++_buffer_curr; 185 ++_buffer_curr;
178 *_hr_curr = _from; 186 *_hr_curr = _from;
179 ++_hr_curr; 187 ++_hr_curr;
180 } 188 }
181 void done () { 189 void done () {