src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp

changeset 10009
8adf45218add
parent 10008
fd3484fadbe3
     1.1 --- a/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp	Wed Sep 23 15:18:53 2020 +0300
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp	Wed Sep 23 16:26:20 2020 +0300
     1.3 @@ -150,7 +150,7 @@
     1.4    assert(worker_id < _nlists, "Invalid worker id");
     1.5  
     1.6    entry->set_obj(NULL);
     1.7 -  entry->set_java_hash(0);
     1.8 +  entry->set_hash(0);
     1.9  
    1.10    if (_cached[worker_id].length() < _max_list_length) {
    1.11      // Cache is not full
    1.12 @@ -237,14 +237,10 @@
    1.13    _table = new G1StringDedupTable(_min_size);
    1.14  }
    1.15  
    1.16 -void G1StringDedupTable::add(typeArrayOop value, uint64_t hash, G1StringDedupEntry** list) {
    1.17 +void G1StringDedupTable::add(typeArrayOop value, unsigned int hash, G1StringDedupEntry** list) {
    1.18    G1StringDedupEntry* entry = _entry_cache->alloc();
    1.19    entry->set_obj(value);
    1.20 -  if (use_java_hash()) {
    1.21 -    entry->set_java_hash((unsigned int)hash);
    1.22 -  } else {
    1.23 -    entry->set_alt_hash(hash);
    1.24 -  }
    1.25 +  entry->set_hash(hash);
    1.26    entry->set_next(*list);
    1.27    *list = entry;
    1.28    _entries++;
    1.29 @@ -259,7 +255,7 @@
    1.30  void G1StringDedupTable::transfer(G1StringDedupEntry** pentry, G1StringDedupTable* dest) {
    1.31    G1StringDedupEntry* entry = *pentry;
    1.32    *pentry = entry->next();
    1.33 -  uint64_t hash = use_java_hash() ? entry->java_hash() : entry->alt_hash();
    1.34 +  unsigned int hash = entry->hash();
    1.35    size_t index = dest->hash_to_index(hash);
    1.36    G1StringDedupEntry** list = dest->bucket(index);
    1.37    entry->set_next(*list);
    1.38 @@ -274,10 +270,10 @@
    1.39                      value1->length() * sizeof(jchar)))));
    1.40  }
    1.41  
    1.42 -typeArrayOop G1StringDedupTable::lookup(typeArrayOop value, uint64_t hash,
    1.43 +typeArrayOop G1StringDedupTable::lookup(typeArrayOop value, unsigned int hash,
    1.44                                          G1StringDedupEntry** list, uintx &count) {
    1.45    for (G1StringDedupEntry* entry = *list; entry != NULL; entry = entry->next()) {
    1.46 -    if ((use_java_hash() ? entry->java_hash() : entry->alt_hash()) == hash) {
    1.47 +    if (entry->hash() == hash) {
    1.48        typeArrayOop existing_value = entry->obj();
    1.49        if (equals(value, existing_value)) {
    1.50          // Match found
    1.51 @@ -291,7 +287,7 @@
    1.52    return NULL;
    1.53  }
    1.54  
    1.55 -typeArrayOop G1StringDedupTable::lookup_or_add_inner(typeArrayOop value, uint64_t hash) {
    1.56 +typeArrayOop G1StringDedupTable::lookup_or_add_inner(typeArrayOop value, unsigned int hash) {
    1.57    size_t index = hash_to_index(hash);
    1.58    G1StringDedupEntry** list = bucket(index);
    1.59    uintx count = 0;
    1.60 @@ -315,25 +311,19 @@
    1.61    return existing_value;
    1.62  }
    1.63  
    1.64 -unsigned int G1StringDedupTable::java_hash_code(typeArrayOop value) {
    1.65 -  assert(use_java_hash(), "Should not use java hash code");
    1.66 +unsigned int G1StringDedupTable::hash_code(typeArrayOop value) {
    1.67    unsigned int hash;
    1.68    int length = value->length();
    1.69    const jchar* data = (jchar*)value->base(T_CHAR);
    1.70  
    1.71 -  hash = java_lang_String::hash_code(data, length);
    1.72 -
    1.73 +  if (use_java_hash()) {
    1.74 +    hash = java_lang_String::hash_code(data, length);
    1.75 +  } else {
    1.76 +    hash = AltHashing::halfsiphash_32(_table->_hash_seed, (const uint16_t*)data, length);
    1.77 +  }
    1.78    return hash;
    1.79  }
    1.80  
    1.81 -uint64_t G1StringDedupTable::alt_hash_code(typeArrayOop value) {
    1.82 -  assert(!use_java_hash(), "Should not use alt hash code");
    1.83 -
    1.84 -  int length = value->length();
    1.85 -  const jbyte* data = (jbyte*)value->base(T_BYTE);
    1.86 -  return AltHashing::halfsiphash_64(_table->_hash_seed, (const int8_t*)data, length);
    1.87 -}
    1.88 -
    1.89  void G1StringDedupTable::deduplicate(oop java_string, G1StringDedupStat& stat) {
    1.90    assert(java_lang_String::is_instance(java_string), "Must be a string");
    1.91    No_Safepoint_Verifier nsv;
    1.92 @@ -347,7 +337,7 @@
    1.93      return;
    1.94    }
    1.95  
    1.96 -  uint64_t hash = 0;
    1.97 +  unsigned int hash = 0;
    1.98  
    1.99    if (use_java_hash()) {
   1.100      // Get hash code from cache
   1.101 @@ -356,7 +346,7 @@
   1.102  
   1.103    if (hash == 0) {
   1.104      // Compute hash
   1.105 -    hash = alt_hash_code(value);
   1.106 +    hash = hash_code(value);
   1.107      stat.inc_hashed();
   1.108    }
   1.109  
   1.110 @@ -510,9 +500,8 @@
   1.111              // destination partitions. finish_rehash() will do a single
   1.112              // threaded transfer of all entries.
   1.113              typeArrayOop value = (typeArrayOop)*p;
   1.114 -            assert(!use_java_hash(), "Should not be using Java hash");
   1.115 -            uint64_t hash = alt_hash_code(value);
   1.116 -            (*entry)->set_alt_hash(hash);
   1.117 +            unsigned int hash = hash_code(value);
   1.118 +            (*entry)->set_hash(hash);
   1.119            }
   1.120  
   1.121            // Move to next entry
   1.122 @@ -575,14 +564,8 @@
   1.123        guarantee(Universe::heap()->is_in_reserved(value), "Object must be on the heap");
   1.124        guarantee(!value->is_forwarded(), "Object must not be forwarded");
   1.125        guarantee(value->is_typeArray(), "Object must be a typeArrayOop");
   1.126 -      uint64_t hash;
   1.127 -      if (use_java_hash()) {
   1.128 -        hash = (*entry)->java_hash();
   1.129 -        guarantee(java_hash_code(value) == hash, "Table entry has incorrect hash");
   1.130 -      } else {
   1.131 -        hash = (*entry)->alt_hash();
   1.132 -        guarantee(alt_hash_code(value) == hash, "Table entry has incorrect hash");
   1.133 -      }
   1.134 +      unsigned int hash = hash_code(value);
   1.135 +      guarantee((*entry)->hash() == hash, "Table entry has inorrect hash");
   1.136        guarantee(_table->hash_to_index(hash) == bucket, "Table entry has incorrect index");
   1.137        entry = (*entry)->next_addr();
   1.138      }
   1.139 @@ -597,10 +580,7 @@
   1.140        G1StringDedupEntry** entry2 = (*entry1)->next_addr();
   1.141        while (*entry2 != NULL) {
   1.142          typeArrayOop value2 = (*entry2)->obj();
   1.143 -        guarantee(value1 != value2, "Table entries must not have the same array");
   1.144 -        if (use_java_hash()) {
   1.145 -          guarantee(!equals(value1, value2), "Table entries must not have identical arrays");
   1.146 -        }
   1.147 +        guarantee(!equals(value1, value2), "Table entries must not have identical arrays");
   1.148          entry2 = (*entry2)->next_addr();
   1.149        }
   1.150        entry1 = (*entry1)->next_addr();
   1.151 @@ -619,7 +599,7 @@
   1.152      "      [Size: " SIZE_FORMAT ", Min: " SIZE_FORMAT ", Max: " SIZE_FORMAT "]\n"
   1.153      "      [Entries: " UINTX_FORMAT ", Load: " G1_STRDEDUP_PERCENT_FORMAT_NS ", Cached: " UINTX_FORMAT ", Added: " UINTX_FORMAT ", Removed: " UINTX_FORMAT "]\n"
   1.154      "      [Resize Count: " UINTX_FORMAT ", Shrink Threshold: " UINTX_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT_NS "), Grow Threshold: " UINTX_FORMAT "(" G1_STRDEDUP_PERCENT_FORMAT_NS ")]\n"
   1.155 -    "      [Rehash Count: " UINTX_FORMAT ", Rehash Threshold: " UINTX_FORMAT ", Hash Seed: " UINT64_FORMAT_X "]\n"
   1.156 +    "      [Rehash Count: " UINTX_FORMAT ", Rehash Threshold: " UINTX_FORMAT ", Hash Seed: " UINT64_FORMAT "]\n"
   1.157      "      [Age Threshold: " UINTX_FORMAT "]",
   1.158      G1_STRDEDUP_BYTES_PARAM(_table->_size * sizeof(G1StringDedupEntry*) + (_table->_entries + _entry_cache->size()) * sizeof(G1StringDedupEntry)),
   1.159      _table->_size, _min_size, _max_size,

mercurial