204 log_trace(stringtable)("Start size: " SIZE_FORMAT " (" SIZE_FORMAT ")", |
204 log_trace(stringtable)("Start size: " SIZE_FORMAT " (" SIZE_FORMAT ")", |
205 _current_size, start_size_log_2); |
205 _current_size, start_size_log_2); |
206 _local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN); |
206 _local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN); |
207 } |
207 } |
208 |
208 |
|
209 void StringTable::update_needs_rehash(bool rehash) { |
|
210 if (rehash) { |
|
211 _needs_rehashing = true; |
|
212 } |
|
213 } |
|
214 |
209 size_t StringTable::item_added() { |
215 size_t StringTable::item_added() { |
210 return Atomic::add((size_t)1, &(the_table()->_items_count)); |
216 return Atomic::add((size_t)1, &(the_table()->_items_count)); |
211 } |
217 } |
212 |
218 |
213 size_t StringTable::add_items_count_to_clean(size_t ndead) { |
219 size_t StringTable::add_items_count_to_clean(size_t ndead) { |
279 Thread* thread = Thread::current(); |
285 Thread* thread = Thread::current(); |
280 StringTableLookupJchar lookup(thread, hash, name, len); |
286 StringTableLookupJchar lookup(thread, hash, name, len); |
281 StringTableGet stg(thread); |
287 StringTableGet stg(thread); |
282 bool rehash_warning; |
288 bool rehash_warning; |
283 _local_table->get(thread, lookup, stg, &rehash_warning); |
289 _local_table->get(thread, lookup, stg, &rehash_warning); |
284 if (rehash_warning) { |
290 update_needs_rehash(rehash_warning); |
285 _needs_rehashing = true; |
|
286 } |
|
287 return stg.get_res_oop(); |
291 return stg.get_res_oop(); |
288 } |
292 } |
289 |
293 |
290 // Interning |
294 // Interning |
291 oop StringTable::intern(Symbol* symbol, TRAPS) { |
295 oop StringTable::intern(Symbol* symbol, TRAPS) { |
332 } |
336 } |
333 return StringTable::the_table()->do_intern(string_or_null_h, name, len, |
337 return StringTable::the_table()->do_intern(string_or_null_h, name, len, |
334 hash, CHECK_NULL); |
338 hash, CHECK_NULL); |
335 } |
339 } |
336 |
340 |
337 class StringTableCreateEntry : public StackObj { |
|
338 private: |
|
339 Thread* _thread; |
|
340 Handle _return; |
|
341 Handle _store; |
|
342 public: |
|
343 StringTableCreateEntry(Thread* thread, Handle store) |
|
344 : _thread(thread), _store(store) {} |
|
345 |
|
346 WeakHandle<vm_string_table_data> operator()() { // No dups found |
|
347 WeakHandle<vm_string_table_data> wh = |
|
348 WeakHandle<vm_string_table_data>::create(_store); |
|
349 return wh; |
|
350 } |
|
351 void operator()(bool inserted, WeakHandle<vm_string_table_data>* val) { |
|
352 oop result = val->resolve(); |
|
353 assert(result != NULL, "Result should be reachable"); |
|
354 _return = Handle(_thread, result); |
|
355 } |
|
356 oop get_return() const { |
|
357 return _return(); |
|
358 } |
|
359 }; |
|
360 |
|
361 oop StringTable::do_intern(Handle string_or_null_h, const jchar* name, |
341 oop StringTable::do_intern(Handle string_or_null_h, const jchar* name, |
362 int len, uintx hash, TRAPS) { |
342 int len, uintx hash, TRAPS) { |
363 HandleMark hm(THREAD); // cleanup strings created |
343 HandleMark hm(THREAD); // cleanup strings created |
364 Handle string_h; |
344 Handle string_h; |
365 |
345 |
375 Universe::heap()->deduplicate_string(string_h()); |
355 Universe::heap()->deduplicate_string(string_h()); |
376 |
356 |
377 assert(java_lang_String::equals(string_h(), name, len), |
357 assert(java_lang_String::equals(string_h(), name, len), |
378 "string must be properly initialized"); |
358 "string must be properly initialized"); |
379 assert(len == java_lang_String::length(string_h()), "Must be same length"); |
359 assert(len == java_lang_String::length(string_h()), "Must be same length"); |
|
360 |
380 StringTableLookupOop lookup(THREAD, hash, string_h); |
361 StringTableLookupOop lookup(THREAD, hash, string_h); |
381 StringTableCreateEntry stc(THREAD, string_h); |
362 StringTableGet stg(THREAD); |
382 |
363 |
383 bool rehash_warning; |
364 bool rehash_warning; |
384 _local_table->get_insert_lazy(THREAD, lookup, stc, stc, &rehash_warning); |
365 do { |
385 if (rehash_warning) { |
366 if (_local_table->get(THREAD, lookup, stg, &rehash_warning)) { |
386 _needs_rehashing = true; |
367 update_needs_rehash(rehash_warning); |
387 } |
368 return stg.get_res_oop(); |
388 return stc.get_return(); |
369 } |
|
370 WeakHandle<vm_string_table_data> wh = WeakHandle<vm_string_table_data>::create(string_h); |
|
371 // The hash table takes ownership of the WeakHandle, even if it's not inserted. |
|
372 if (_local_table->insert(THREAD, lookup, wh, &rehash_warning)) { |
|
373 update_needs_rehash(rehash_warning); |
|
374 return wh.resolve(); |
|
375 } |
|
376 } while(true); |
389 } |
377 } |
390 |
378 |
391 // GC support |
379 // GC support |
392 class StringTableIsAliveCounter : public BoolObjectClosure { |
380 class StringTableIsAliveCounter : public BoolObjectClosure { |
393 BoolObjectClosure* _real_boc; |
381 BoolObjectClosure* _real_boc; |