93 SymbolTableConfig, mtSymbol> SymbolTableHash; 94 95 class SymbolTableCreateEntry; 96 97 class SymbolTable : public CHeapObj<mtSymbol> { 98 friend class VMStructs; 99 friend class Symbol; 100 friend class ClassFileParser; 101 friend class SymbolTableConfig; 102 friend class SymbolTableCreateEntry; 103 104 private: 105 static void delete_symbol(Symbol* sym); 106 void grow(JavaThread* jt); 107 void clean_dead_entries(JavaThread* jt); 108 109 // The symbol table 110 static SymbolTable* _the_table; 111 // Shared symbol table. 112 static CompactHashtable<Symbol*, char> _shared_table; 113 static bool _lookup_shared_first; 114 static bool _alt_hash; 115 116 // For statistics 117 static int _symbols_removed; 118 static int _symbols_counted; 119 120 // Set if one bucket is out of balance due to hash algorithm deficiency 121 SymbolTableHash* _local_table; 122 size_t _current_size; 123 volatile bool _has_work; 124 volatile bool _needs_rehashing; 125 126 volatile int _items; 127 DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int)); 128 volatile int _uncleaned_items; 129 DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int)); 130 131 double get_load_factor(); 132 double get_dead_factor(); 133 134 void check_concurrent_work(); 135 void trigger_concurrent_work(); 136 137 static uintx item_added(); 138 static void item_removed(); 139 static void set_item_clean_count(size_t ncl); 140 static void mark_item_clean_count(); 141 142 SymbolTable(); 143 144 Symbol* allocate_symbol(const u1* name, int len, bool c_heap, TRAPS); // Assumes no characters larger than 0x7F 145 Symbol* do_lookup(char* name, int len, uintx hash); 146 Symbol* do_add_if_needed(char* name, int len, uintx hash, bool heap, TRAPS); 147 148 // Adding elements 149 static void add(ClassLoaderData* loader_data, 150 const constantPoolHandle& cp, int names_count, 151 const char** names, int* lengths, int* cp_indices, 152 unsigned int* hashValues, TRAPS); 153 154 static void new_symbols(ClassLoaderData* loader_data, 155 const constantPoolHandle& cp, int names_count, 156 const char** name, int* lengths, 157 int* cp_indices, unsigned int* hashValues, 158 TRAPS) { 159 add(loader_data, cp, names_count, name, lengths, cp_indices, hashValues, THREAD); 160 } 161 162 static Symbol* lookup_shared(const char* name, int len, unsigned int hash); 163 Symbol* lookup_dynamic(const char* name, int len, unsigned int hash); 164 Symbol* lookup_common(const char* name, int len, unsigned int hash); 165 166 // Arena for permanent symbols (null class loader) that are never unloaded | 93 SymbolTableConfig, mtSymbol> SymbolTableHash; 94 95 class SymbolTableCreateEntry; 96 97 class SymbolTable : public CHeapObj<mtSymbol> { 98 friend class VMStructs; 99 friend class Symbol; 100 friend class ClassFileParser; 101 friend class SymbolTableConfig; 102 friend class SymbolTableCreateEntry; 103 104 private: 105 static void delete_symbol(Symbol* sym); 106 void grow(JavaThread* jt); 107 void clean_dead_entries(JavaThread* jt); 108 109 // The symbol table 110 static SymbolTable* _the_table; 111 // Shared symbol table. 112 static CompactHashtable<Symbol*, char> _shared_table; 113 static volatile bool _lookup_shared_first; 114 static volatile bool _alt_hash; 115 116 // For statistics 117 volatile size_t _symbols_removed; 118 volatile size_t _symbols_counted; 119 120 SymbolTableHash* _local_table; 121 size_t _current_size; 122 volatile bool _has_work; 123 // Set if one bucket is out of balance due to hash algorithm deficiency 124 volatile bool _needs_rehashing; 125 126 volatile size_t _items_count; 127 volatile size_t _uncleaned_items_count; 128 129 double get_load_factor(); 130 double get_dead_factor(); 131 132 void check_concurrent_work(); 133 void trigger_concurrent_work(); 134 135 static void item_added(); 136 static void item_removed(); 137 static void set_item_clean_count(size_t ncl); 138 static void mark_item_clean_count(); 139 140 SymbolTable(); 141 142 Symbol* allocate_symbol(const char* name, int len, bool c_heap, TRAPS); // Assumes no characters larger than 0x7F 143 Symbol* do_lookup(const char* name, int len, uintx hash); 144 Symbol* do_add_if_needed(const char* name, int len, uintx hash, bool heap, TRAPS); 145 146 // Adding elements 147 static void add(ClassLoaderData* loader_data, 148 const constantPoolHandle& cp, int names_count, 149 const char** names, int* lengths, int* cp_indices, 150 unsigned int* hashValues, TRAPS); 151 152 static void new_symbols(ClassLoaderData* loader_data, 153 const constantPoolHandle& cp, int names_count, 154 const char** name, int* lengths, 155 int* cp_indices, unsigned int* hashValues, 156 TRAPS) { 157 add(loader_data, cp, names_count, name, lengths, cp_indices, hashValues, THREAD); 158 } 159 160 static Symbol* lookup_shared(const char* name, int len, unsigned int hash); 161 Symbol* lookup_dynamic(const char* name, int len, unsigned int hash); 162 Symbol* lookup_common(const char* name, int len, unsigned int hash); 163 164 // Arena for permanent symbols (null class loader) that are never unloaded |