@@ -156,7 +156,7 @@ void StringDedupEntryCache::free(StringDedupEntry* entry, uint worker_id) {
156
156
assert (worker_id < _nlists, " Invalid worker id" );
157
157
158
158
entry->set_obj (NULL );
159
- entry->set_java_hash ( 0 , false /* latin1 */ );
159
+ entry->set_hash ( 0 );
160
160
161
161
if (_cached[worker_id].length () < _max_list_length) {
162
162
// Cache is not full
@@ -246,14 +246,11 @@ void StringDedupTable::create() {
246
246
_table = new StringDedupTable (_min_size);
247
247
}
248
248
249
- void StringDedupTable::add (typeArrayOop value, bool latin1, uint64_t hash, StringDedupEntry** list) {
249
+ void StringDedupTable::add (typeArrayOop value, bool latin1, unsigned int hash, StringDedupEntry** list) {
250
250
StringDedupEntry* entry = _entry_cache->alloc ();
251
251
entry->set_obj (value);
252
- if (use_java_hash ()) {
253
- entry->set_java_hash ((unsigned int )hash, latin1);
254
- } else {
255
- entry->set_alt_hash (hash);
256
- }
252
+ entry->set_hash (hash);
253
+ entry->set_latin1 (latin1);
257
254
entry->set_next (*list);
258
255
*list = entry;
259
256
_entries++;
@@ -268,18 +265,17 @@ void StringDedupTable::remove(StringDedupEntry** pentry, uint worker_id) {
268
265
void StringDedupTable::transfer (StringDedupEntry** pentry, StringDedupTable* dest) {
269
266
StringDedupEntry* entry = *pentry;
270
267
*pentry = entry->next ();
271
- uint64_t hash = use_java_hash () ? entry->java_hash () : entry-> alt_hash ();
268
+ unsigned int hash = entry->hash ();
272
269
size_t index = dest->hash_to_index (hash);
273
270
StringDedupEntry** list = dest->bucket (index);
274
271
entry->set_next (*list);
275
272
*list = entry;
276
273
}
277
274
278
- typeArrayOop StringDedupTable::lookup (typeArrayOop value, bool latin1, uint64_t hash,
275
+ typeArrayOop StringDedupTable::lookup (typeArrayOop value, bool latin1, unsigned int hash,
279
276
StringDedupEntry** list, uintx &count) {
280
277
for (StringDedupEntry* entry = *list; entry != NULL ; entry = entry->next ()) {
281
- if ((use_java_hash () && entry->java_hash () == hash && entry->java_hash_latin1 () == latin1) ||
282
- (!use_java_hash () && entry->alt_hash () == hash)) {
278
+ if (entry->hash () == hash && entry->latin1 () == latin1) {
283
279
oop* obj_addr = (oop*)entry->obj_addr ();
284
280
oop obj = NativeAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load (obj_addr);
285
281
if (obj != NULL && java_lang_String::value_equals (value, static_cast <typeArrayOop>(obj))) {
@@ -294,7 +290,7 @@ typeArrayOop StringDedupTable::lookup(typeArrayOop value, bool latin1, uint64_t
294
290
return NULL ;
295
291
}
296
292
297
- typeArrayOop StringDedupTable::lookup_or_add_inner (typeArrayOop value, bool latin1, uint64_t hash) {
293
+ typeArrayOop StringDedupTable::lookup_or_add_inner (typeArrayOop value, bool latin1, unsigned int hash) {
298
294
size_t index = hash_to_index (hash);
299
295
StringDedupEntry** list = bucket (index);
300
296
uintx count = 0 ;
@@ -318,31 +314,29 @@ typeArrayOop StringDedupTable::lookup_or_add_inner(typeArrayOop value, bool lati
318
314
return existing_value;
319
315
}
320
316
321
- unsigned int StringDedupTable::java_hash_code (typeArrayOop value, bool latin1) {
322
- assert (use_java_hash (), " Should not use java hash code" );
323
-
317
+ unsigned int StringDedupTable::hash_code (typeArrayOop value, bool latin1) {
324
318
unsigned int hash;
325
319
int length = value->length ();
326
320
if (latin1) {
327
321
const jbyte* data = (jbyte*)value->base (T_BYTE);
328
- hash = java_lang_String::hash_code (data, length);
322
+ if (use_java_hash ()) {
323
+ hash = java_lang_String::hash_code (data, length);
324
+ } else {
325
+ hash = AltHashing::halfsiphash_32 (_table->_hash_seed , (const uint8_t *)data, length);
326
+ }
329
327
} else {
330
328
length /= sizeof (jchar) / sizeof (jbyte); // Convert number of bytes to number of chars
331
329
const jchar* data = (jchar*)value->base (T_CHAR);
332
- hash = java_lang_String::hash_code (data, length);
330
+ if (use_java_hash ()) {
331
+ hash = java_lang_String::hash_code (data, length);
332
+ } else {
333
+ hash = AltHashing::halfsiphash_32 (_table->_hash_seed , (const uint16_t *)data, length);
334
+ }
333
335
}
334
336
335
337
return hash;
336
338
}
337
339
338
- uint64_t StringDedupTable::alt_hash_code (typeArrayOop value) {
339
- assert (!use_java_hash (), " Should not use alt hash code" );
340
-
341
- int length = value->length ();
342
- const jbyte* data = (jbyte*)value->base (T_BYTE);
343
- return AltHashing::halfsiphash_64 (_table->_hash_seed , (const int8_t *)data, length);
344
- }
345
-
346
340
void StringDedupTable::deduplicate (oop java_string, StringDedupStat* stat) {
347
341
assert (java_lang_String::is_instance (java_string), " Must be a string" );
348
342
NoSafepointVerifier nsv;
@@ -357,7 +351,7 @@ void StringDedupTable::deduplicate(oop java_string, StringDedupStat* stat) {
357
351
}
358
352
359
353
bool latin1 = java_lang_String::is_latin1 (java_string);
360
- uint64_t hash = 0 ;
354
+ unsigned int hash = 0 ;
361
355
362
356
if (use_java_hash ()) {
363
357
if (!java_lang_String::hash_is_set (java_string)) {
@@ -366,7 +360,7 @@ void StringDedupTable::deduplicate(oop java_string, StringDedupStat* stat) {
366
360
hash = java_lang_String::hash_code (java_string);
367
361
} else {
368
362
// Compute hash
369
- hash = alt_hash_code (value);
363
+ hash = hash_code (value, latin1 );
370
364
stat->inc_hashed ();
371
365
}
372
366
@@ -516,9 +510,9 @@ uintx StringDedupTable::unlink_or_oops_do(StringDedupUnlinkOrOopsDoClosure* cl,
516
510
// destination partitions. finish_rehash() will do a single
517
511
// threaded transfer of all entries.
518
512
typeArrayOop value = (typeArrayOop)*p;
519
- assert (! use_java_hash (), " Should not be using Java hash " );
520
- uint64_t hash = alt_hash_code (value);
521
- (*entry)->set_alt_hash (hash);
513
+ bool latin1 = (*entry)-> latin1 ( );
514
+ unsigned int hash = hash_code (value, latin1 );
515
+ (*entry)->set_hash (hash);
522
516
}
523
517
524
518
// Move to next entry
@@ -612,14 +606,9 @@ void StringDedupTable::verify() {
612
606
guarantee (Universe::heap ()->is_in (value), " Object must be on the heap" );
613
607
guarantee (!value->is_forwarded (), " Object must not be forwarded" );
614
608
guarantee (value->is_typeArray (), " Object must be a typeArrayOop" );
615
- uint64_t hash;
616
- if (use_java_hash ()) {
617
- hash = (*entry)->java_hash ();
618
- guarantee (java_hash_code (value, (*entry)->java_hash_latin1 ()) == hash, " Table entry has incorrect hash" );
619
- } else {
620
- hash = (*entry)->alt_hash ();
621
- guarantee (alt_hash_code (value) == hash, " Table entry has incorrect hash" );
622
- }
609
+ bool latin1 = (*entry)->latin1 ();
610
+ unsigned int hash = hash_code (value, latin1);
611
+ guarantee ((*entry)->hash () == hash, " Table entry has inorrect hash" );
623
612
guarantee (_table->hash_to_index (hash) == bucket, " Table entry has incorrect index" );
624
613
entry = (*entry)->next_addr ();
625
614
}
@@ -631,14 +620,12 @@ void StringDedupTable::verify() {
631
620
StringDedupEntry** entry1 = _table->bucket (bucket);
632
621
while (*entry1 != NULL ) {
633
622
typeArrayOop value1 = (*entry1)->obj ();
623
+ bool latin1_1 = (*entry1)->latin1 ();
634
624
StringDedupEntry** entry2 = (*entry1)->next_addr ();
635
625
while (*entry2 != NULL ) {
636
626
typeArrayOop value2 = (*entry2)->obj ();
637
- guarantee (value1 != value2, " Table entries must not have the same array" );
638
- if (use_java_hash ()) {
639
- guarantee ((*entry1)->java_hash_latin1 () != (*entry2)->java_hash_latin1 () ||
640
- !java_lang_String::value_equals (value1, value2), " Table entries must not have identical arrays" );
641
- }
627
+ bool latin1_2 = (*entry2)->latin1 ();
628
+ guarantee (latin1_1 != latin1_2 || !java_lang_String::value_equals (value1, value2), " Table entries must not have identical arrays" );
642
629
entry2 = (*entry2)->next_addr ();
643
630
}
644
631
entry1 = (*entry1)->next_addr ();
@@ -660,6 +647,6 @@ void StringDedupTable::print_statistics() {
660
647
_table->_entries , percent_of ((size_t )_table->_entries , _table->_size ), _entry_cache->size (), _entries_added, _entries_removed);
661
648
log.debug (" Resize Count: " UINTX_FORMAT " , Shrink Threshold: " UINTX_FORMAT " (" STRDEDUP_PERCENT_FORMAT_NS " ), Grow Threshold: " UINTX_FORMAT " (" STRDEDUP_PERCENT_FORMAT_NS " )" ,
662
649
_resize_count, _table->_shrink_threshold , _shrink_load_factor * 100.0 , _table->_grow_threshold , _grow_load_factor * 100.0 );
663
- log.debug (" Rehash Count: " UINTX_FORMAT " , Rehash Threshold: " UINTX_FORMAT " , Hash Seed: " UINT64_FORMAT_X , _rehash_count, _rehash_threshold, _table->_hash_seed );
650
+ log.debug (" Rehash Count: " UINTX_FORMAT " , Rehash Threshold: " UINTX_FORMAT " , Hash Seed: " UINT64_FORMAT , _rehash_count, _rehash_threshold, _table->_hash_seed );
664
651
log.debug (" Age Threshold: " UINTX_FORMAT, StringDeduplicationAgeThreshold);
665
652
}
0 commit comments