< prev index next >
src/hotspot/share/classfile/symbolTable.cpp
Print this page
*** 132,142 ****
_local_table = new SymbolTableHash(start_size_log_2, END_SIZE, REHASH_LEN);
}
void SymbolTable::delete_symbol(Symbol* sym) {
if (sym->refcount() == PERM_REFCOUNT) {
! MutexLocker ml(SymbolTable_lock); // Protect arena
// Deleting permanent symbol should not occur very often (insert race condition),
// so log it.
log_trace_symboltable_helper(sym, "Freeing permanent symbol");
if (!arena()->Afree(sym, sym->size())) {
log_trace_symboltable_helper(sym, "Leaked permanent symbol");
--- 132,142 ----
_local_table = new SymbolTableHash(start_size_log_2, END_SIZE, REHASH_LEN);
}
void SymbolTable::delete_symbol(Symbol* sym) {
if (sym->refcount() == PERM_REFCOUNT) {
! MutexLockerEx ml(SymbolArena_lock, Mutex::_no_safepoint_check_flag); // Protect arena
// Deleting permanent symbol should not occur very often (insert race condition),
// so log it.
log_trace_symboltable_helper(sym, "Freeing permanent symbol");
if (!arena()->Afree(sym, sym->size())) {
log_trace_symboltable_helper(sym, "Leaked permanent symbol");
*** 195,205 ****
// refcount starts as 1
sym = new (len, THREAD) Symbol((const u1*)name, len, 1);
assert(sym != NULL, "new should call vm_exit_out_of_memory if C_HEAP is exhausted");
} else {
// Allocate to global arena
! MutexLocker ml(SymbolTable_lock); // Protect arena
sym = new (len, arena(), THREAD) Symbol((const u1*)name, len, PERM_REFCOUNT);
}
return sym;
}
--- 195,205 ----
// refcount starts as 1
sym = new (len, THREAD) Symbol((const u1*)name, len, 1);
assert(sym != NULL, "new should call vm_exit_out_of_memory if C_HEAP is exhausted");
} else {
// Allocate to global arena
! MutexLockerEx ml(SymbolArena_lock, Mutex::_no_safepoint_check_flag); // Protect arena
sym = new (len, arena(), THREAD) Symbol((const u1*)name, len, PERM_REFCOUNT);
}
return sym;
}
< prev index next >