Mercurial > hg > truffle
comparison src/share/vm/code/oopRecorder.hpp @ 17375:44b83285b645
Deduplicate constant oops during code installation
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Wed, 08 Oct 2014 11:50:00 -0700 |
parents | 9928ad27a80e |
children | 50942f016967 |
comparison
equal
deleted
inserted
replaced
17374:9928ad27a80e | 17375:44b83285b645 |
---|---|
144 #ifdef ASSERT | 144 #ifdef ASSERT |
145 static int _find_index_calls, _hit_indexes, _missed_indexes; | 145 static int _find_index_calls, _hit_indexes, _missed_indexes; |
146 #endif | 146 #endif |
147 }; | 147 }; |
148 | 148 |
149 class OopRecorder; | |
150 | |
151 class ObjectLookup : public ResourceObj { | |
152 private: | |
153 class ObjectEntry { | |
154 private: | |
155 jobject _value; | |
156 int _index; | |
157 | |
158 public: | |
159 ObjectEntry(jobject value, int index): _value(value), _index(index) {} | |
160 ObjectEntry() {} | |
161 oop oop_value(); // { return JNIHandles::resolve(_value); } | |
162 int index() { return _index; } | |
163 }; | |
164 | |
165 GrowableArray<ObjectEntry> _values; | |
166 unsigned int _gc_count; | |
167 | |
168 // Utility sort functions | |
169 static int sort_by_address(oop a, oop b); | |
170 static int sort_by_address(ObjectEntry* a, ObjectEntry* b); | |
171 static int sort_oop_by_address(oop a, ObjectEntry b); | |
172 | |
173 public: | |
174 ObjectLookup(); | |
175 | |
176 // Resort list if a GC has occurred since the last sort | |
177 void maybe_resort(); | |
178 int find_index(jobject object, OopRecorder* oop_recorder); | |
179 }; | |
180 | |
149 class OopRecorder : public ResourceObj { | 181 class OopRecorder : public ResourceObj { |
150 private: | 182 private: |
151 ValueRecorder<jobject> _oops; | 183 ValueRecorder<jobject> _oops; |
152 ValueRecorder<Metadata*> _metadata; | 184 ValueRecorder<Metadata*> _metadata; |
185 ObjectLookup* _object_lookup; | |
153 public: | 186 public: |
154 OopRecorder(Arena* arena = NULL): _oops(arena), _metadata(arena) {} | 187 OopRecorder(Arena* arena = NULL, bool deduplicate = false): _oops(arena), _metadata(arena) { |
188 if (deduplicate) { | |
189 _object_lookup = new ObjectLookup(); | |
190 } else { | |
191 _object_lookup = NULL; | |
192 } | |
193 } | |
155 | 194 |
156 void check_for_duplicates(int index, jobject h) NOT_DEBUG_RETURN; | 195 void check_for_duplicates(int index, jobject h) NOT_DEBUG_RETURN; |
157 | 196 |
158 int allocate_oop_index(jobject h) { | 197 int allocate_oop_index(jobject h) { |
159 return _oops.allocate_index(h); | 198 return _oops.allocate_index(h); |
160 } | 199 } |
161 int find_index(jobject h) { | 200 int find_index(jobject h) { |
162 int result = _oops.find_index(h); | 201 int result = _object_lookup != NULL ? _object_lookup->find_index(h, this) : _oops.find_index(h); |
163 check_for_duplicates(result, h); | 202 check_for_duplicates(result, h); |
164 return result; | 203 return result; |
165 } | 204 } |
166 jobject oop_at(int index) { | 205 jobject oop_at(int index) { |
167 return _oops.at(index); | 206 return _oops.at(index); |