hotspot/src/share/vm/utilities/hashtable.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13728 882756847a04
child 17610 c6857feaac47
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
     2
 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1623
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
13199
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
    26
#include "classfile/altHashing.hpp"
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
    27
#include "classfile/javaClasses.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "memory/allocation.inline.hpp"
13097
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
    29
#include "memory/filemap.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "utilities/hashtable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "utilities/hashtable.inline.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    37
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// This is a generic hashtable, designed to be used for the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// and string tables.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// It is implemented as an open hash table with a fixed number of buckets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// %note:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//  - HashtableEntrys are allocated in blocks to reduce the space overhead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    46
template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry(unsigned int hashValue) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    47
  BasicHashtableEntry<F>* entry;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  if (_free_list) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    entry = _free_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    _free_list = _free_list->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  } else {
1551
b431de37a22c 6770949: minor tweaks before 6655638
jrose
parents: 1
diff changeset
    53
    if (_first_free_entry + _entry_size >= _end_block) {
b431de37a22c 6770949: minor tweaks before 6655638
jrose
parents: 1
diff changeset
    54
      int block_size = MIN2(512, MAX2((int)_table_size / 2, (int)_number_of_entries));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
      int len = _entry_size * block_size;
1551
b431de37a22c 6770949: minor tweaks before 6655638
jrose
parents: 1
diff changeset
    56
      len = 1 << log2_intptr(len); // round down to power of 2
b431de37a22c 6770949: minor tweaks before 6655638
jrose
parents: 1
diff changeset
    57
      assert(len >= _entry_size, "");
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    58
      _first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
      _end_block = _first_free_entry + len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    61
    entry = (BasicHashtableEntry<F>*)_first_free_entry;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
    _first_free_entry += _entry_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
1551
b431de37a22c 6770949: minor tweaks before 6655638
jrose
parents: 1
diff changeset
    65
  assert(_entry_size % HeapWordSize == 0, "");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  entry->set_hash(hashValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    71
template <class T, MEMFLAGS F> HashtableEntry<T, F>* Hashtable<T, F>::new_entry(unsigned int hashValue, T obj) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    72
  HashtableEntry<T, F>* entry;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    74
  entry = (HashtableEntry<T, F>*)BasicHashtable<F>::new_entry(hashValue);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    75
  entry->set_literal(obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    79
// Check to see if the hashtable is unbalanced.  The caller set a flag to
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    80
// rehash at the next safepoint.  If this bucket is 60 times greater than the
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    81
// expected average bucket length, it's an unbalanced hashtable.
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    82
// This is somewhat an arbitrary heuristic but if one bucket gets to
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    83
// rehash_count which is currently 100, there's probably something wrong.
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    84
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
    85
template <MEMFLAGS F> bool BasicHashtable<F>::check_rehash_table(int count) {
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    86
  assert(table_size() != 0, "underflow");
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    87
  if (count > (((double)number_of_entries()/(double)table_size())*rehash_multiple)) {
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    88
    // Set a flag for the next safepoint, which should be at some guaranteed
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    89
    // safepoint interval.
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    90
    return true;
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    91
  }
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    92
  return false;
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    93
}
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    94
13199
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
    95
template <class T, MEMFLAGS F> jint Hashtable<T, F>::_seed = 0;
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
    96
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    97
// Create a new table and using alternate hash code, populate the new table
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    98
// with the existing elements.   This can be used to change the hash code
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
    99
// and could in the future change the size of the table.
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   100
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   101
template <class T, MEMFLAGS F> void Hashtable<T, F>::move_to(Hashtable<T, F>* new_table) {
13199
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   102
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   103
  // Initialize the global seed for hashing.
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   104
  _seed = AltHashing::compute_seed();
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   105
  assert(seed() != 0, "shouldn't be zero");
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   106
025b0984feea 7181200: JVM new hashing code breaks SA in product mode
coleenp
parents: 13195
diff changeset
   107
  int saved_entry_count = this->number_of_entries();
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   108
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   109
  // Iterate through the table and create a new entry for the new table
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   110
  for (int i = 0; i < new_table->table_size(); ++i) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   111
    for (HashtableEntry<T, F>* p = bucket(i); p != NULL; ) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   112
      HashtableEntry<T, F>* next = p->next();
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   113
      T string = p->literal();
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   114
      // Use alternate hashing algorithm on the symbol in the first table
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13342
diff changeset
   115
      unsigned int hashValue = string->new_hash(seed());
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   116
      // Get a new index relative to the new table (can also change size)
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   117
      int index = new_table->hash_to_index(hashValue);
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   118
      p->set_hash(hashValue);
13097
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   119
      // Keep the shared bit in the Hashtable entry to indicate that this entry
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   120
      // can't be deleted.   The shared bit is the LSB in the _next field so
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   121
      // walking the hashtable past these entries requires
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   122
      // BasicHashtableEntry::make_ptr() call.
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   123
      bool keep_shared = p->is_shared();
13342
76a5de64aa62 7186278: Build error after CR#6995781 / 7151532 with GCC 4.7.0
andrew
parents: 13199
diff changeset
   124
      this->unlink_entry(p);
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   125
      new_table->add_entry(index, p);
13097
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   126
      if (keep_shared) {
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   127
        p->set_shared();
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   128
      }
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   129
      p = next;
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   130
    }
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   131
  }
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   132
  // give the new table the free list as well
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   133
  new_table->copy_freelist(this);
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   134
  assert(new_table->number_of_entries() == saved_entry_count, "lost entry on dictionary copy?");
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   135
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   136
  // Destroy memory used by the buckets in the hashtable.  The memory
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   137
  // for the elements has been used in a new table and is not
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   138
  // destroyed.  The memory reuse will benefit resizing the SystemDictionary
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   139
  // to avoid a memory allocation spike at safepoint.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   140
  BasicHashtable<F>::free_buckets();
13087
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   141
}
673ea6efaf18 7158800: Improve storage of symbol tables
coleenp
parents: 10739
diff changeset
   142
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   143
template <MEMFLAGS F> void BasicHashtable<F>::free_buckets() {
13097
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   144
  if (NULL != _buckets) {
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   145
    // Don't delete the buckets in the shared space.  They aren't
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   146
    // allocated by os::malloc
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   147
    if (!UseSharedSpaces ||
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   148
        !FileMapInfo::current_info()->is_in_shared_space(_buckets)) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   149
       FREE_C_HEAP_ARRAY(HashtableBucket, _buckets, F);
13097
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   150
    }
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   151
    _buckets = NULL;
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   152
  }
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   153
}
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   154
c146b608d91f 7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
coleenp
parents: 13087
diff changeset
   155
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
// Reverse the order of elements in the hash buckets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   158
template <MEMFLAGS F> void BasicHashtable<F>::reverse() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  for (int i = 0; i < _table_size; ++i) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   161
    BasicHashtableEntry<F>* new_list = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   162
    BasicHashtableEntry<F>* p = bucket(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    while (p != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   164
      BasicHashtableEntry<F>* next = p->next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
      p->set_next(new_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
      new_list = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
      p = next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    *bucket_addr(i) = new_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
// Copy the table to the shared space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   176
template <MEMFLAGS F> void BasicHashtable<F>::copy_table(char** top, char* end) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // Dump the hash table entries.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  intptr_t *plen = (intptr_t*)(*top);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  *top += sizeof(*plen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  for (i = 0; i < _table_size; ++i) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   185
    for (BasicHashtableEntry<F>** p = _buckets[i].entry_addr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
                              *p != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
                               p = (*p)->next_addr()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
      if (*top + entry_size() > end) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   189
        report_out_of_shared_space(SharedMiscData);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
      }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   191
      *p = (BasicHashtableEntry<F>*)memcpy(*top, *p, entry_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
      *top += entry_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  *plen = (char*)(*top) - (char*)plen - sizeof(*plen);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Set the shared bit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  for (i = 0; i < _table_size; ++i) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   200
    for (BasicHashtableEntry<F>* p = bucket(i); p != NULL; p = p->next()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
      p->set_shared();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// Reverse the order of elements in the hash buckets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   210
template <class T, MEMFLAGS F> void Hashtable<T, F>::reverse(void* boundary) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   212
  for (int i = 0; i < this->table_size(); ++i) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   213
    HashtableEntry<T, F>* high_list = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   214
    HashtableEntry<T, F>* low_list = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   215
    HashtableEntry<T, F>* last_low_entry = NULL;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   216
    HashtableEntry<T, F>* p = bucket(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    while (p != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   218
      HashtableEntry<T, F>* next = p->next();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      if ((void*)p->literal() >= boundary) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
        p->set_next(high_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
        high_list = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
        p->set_next(low_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
        low_list = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
        if (last_low_entry == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
          last_low_entry = p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
      p = next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    if (low_list != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
      *bucket_addr(i) = low_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
      last_low_entry->set_next(high_list);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
      *bucket_addr(i) = high_list;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
// Dump the hash table buckets.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   243
template <MEMFLAGS F> void BasicHashtable<F>::copy_buckets(char** top, char* end) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   244
  intptr_t len = _table_size * sizeof(HashtableBucket<F>);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  *(intptr_t*)(*top) = len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  *top += sizeof(intptr_t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  *(intptr_t*)(*top) = _number_of_entries;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  *top += sizeof(intptr_t);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  if (*top + len > end) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   252
    report_out_of_shared_space(SharedMiscData);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   254
  _buckets = (HashtableBucket<F>*)memcpy(*top, _buckets, len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  *top += len;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   261
template <class T, MEMFLAGS F> void Hashtable<T, F>::print() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   264
  for (int i = 0; i < BasicHashtable<F>::table_size(); i++) {
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   265
    HashtableEntry<T, F>* entry = bucket(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    while(entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
      tty->print("%d : ", i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
      entry->literal()->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
      tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
      entry = entry->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   276
template <MEMFLAGS F> void BasicHashtable<F>::verify() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  int count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  for (int i = 0; i < table_size(); i++) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   279
    for (BasicHashtableEntry<F>* p = bucket(i); p != NULL; p = p->next()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
      ++count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  assert(count == number_of_entries(), "number of hashtable entries incorrect");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   292
template <MEMFLAGS F> void BasicHashtable<F>::verify_lookup_length(double load) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  if ((double)_lookup_length / (double)_lookup_count > load * 2.0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    warning("Performance bug: SystemDictionary lookup_count=%d "
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
            "lookup_length=%d average=%lf load=%f",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
            _lookup_count, _lookup_length,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
            (double) _lookup_length / _lookup_count, load);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
#endif
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   302
// Explicitly instantiate these types
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13342
diff changeset
   303
template class Hashtable<ConstantPool*, mtClass>;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   304
template class Hashtable<Symbol*, mtSymbol>;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13342
diff changeset
   305
template class Hashtable<Klass*, mtClass>;
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   306
template class Hashtable<oop, mtClass>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   307
#ifdef SOLARIS
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   308
template class Hashtable<oop, mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   309
#endif
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   310
template class Hashtable<oopDesc*, mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   311
template class Hashtable<Symbol*, mtClass>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   312
template class HashtableEntry<Symbol*, mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   313
template class HashtableEntry<Symbol*, mtClass>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   314
template class HashtableEntry<oop, mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   315
template class BasicHashtableEntry<mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   316
template class BasicHashtableEntry<mtCode>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   317
template class BasicHashtable<mtClass>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   318
template class BasicHashtable<mtSymbol>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   319
template class BasicHashtable<mtCode>;
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 13097
diff changeset
   320
template class BasicHashtable<mtInternal>;