172 _arena = new (mtSymbol) Arena(mtSymbol); 173 } else { 174 _arena = new (mtSymbol) Arena(mtSymbol, symbol_alloc_arena_size); 175 } 176 } 177 178 void SymbolTable::delete_symbol(Symbol* sym) { 179 if (sym->refcount() == PERM_REFCOUNT) { 180 MutexLocker ml(SymbolArena_lock, Mutex::_no_safepoint_check_flag); // Protect arena 181 // Deleting permanent symbol should not occur very often (insert race condition), 182 // so log it. 183 log_trace_symboltable_helper(sym, "Freeing permanent symbol"); 184 if (!arena()->Afree(sym, sym->size())) { 185 log_trace_symboltable_helper(sym, "Leaked permanent symbol"); 186 } 187 } else { 188 delete sym; 189 } 190 } 191 192 void SymbolTable::reset_has_items_to_clean() { Atomic::store(false, &_has_items_to_clean); } 193 void SymbolTable::mark_has_items_to_clean() { Atomic::store(true, &_has_items_to_clean); } 194 bool SymbolTable::has_items_to_clean() { return Atomic::load(&_has_items_to_clean); } 195 196 void SymbolTable::item_added() { 197 Atomic::inc(&_items_count); 198 } 199 200 void SymbolTable::item_removed() { 201 Atomic::inc(&(_symbols_removed)); 202 Atomic::dec(&_items_count); 203 } 204 205 double SymbolTable::get_load_factor() { 206 return (double)_items_count/_current_size; 207 } 208 209 size_t SymbolTable::table_size() { 210 return ((size_t)1) << _local_table->get_size_log2(Thread::current()); 211 } 212 213 void SymbolTable::trigger_cleanup() { | 172 _arena = new (mtSymbol) Arena(mtSymbol); 173 } else { 174 _arena = new (mtSymbol) Arena(mtSymbol, symbol_alloc_arena_size); 175 } 176 } 177 178 void SymbolTable::delete_symbol(Symbol* sym) { 179 if (sym->refcount() == PERM_REFCOUNT) { 180 MutexLocker ml(SymbolArena_lock, Mutex::_no_safepoint_check_flag); // Protect arena 181 // Deleting permanent symbol should not occur very often (insert race condition), 182 // so log it. 183 log_trace_symboltable_helper(sym, "Freeing permanent symbol"); 184 if (!arena()->Afree(sym, sym->size())) { 185 log_trace_symboltable_helper(sym, "Leaked permanent symbol"); 186 } 187 } else { 188 delete sym; 189 } 190 } 191 192 void SymbolTable::reset_has_items_to_clean() { Atomic::store(&_has_items_to_clean, false); } 193 void SymbolTable::mark_has_items_to_clean() { Atomic::store(&_has_items_to_clean, true); } 194 bool SymbolTable::has_items_to_clean() { return Atomic::load(&_has_items_to_clean); } 195 196 void SymbolTable::item_added() { 197 Atomic::inc(&_items_count); 198 } 199 200 void SymbolTable::item_removed() { 201 Atomic::inc(&(_symbols_removed)); 202 Atomic::dec(&_items_count); 203 } 204 205 double SymbolTable::get_load_factor() { 206 return (double)_items_count/_current_size; 207 } 208 209 size_t SymbolTable::table_size() { 210 return ((size_t)1) << _local_table->get_size_log2(Thread::current()); 211 } 212 213 void SymbolTable::trigger_cleanup() { |