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