I was running Dan's forte stress tests and the PepTest hung. The stack
trace is here:
=>[1] ___lwp_mutex_lock(0xdfa1a4d8), at 0xdfadb349
[2] _lwp_mutex_lock(0xdfa1a4d8), at 0xdfb073c6
[3] ThreadCritical::ThreadCritical(this = ???) (optimized), at 0xdf01b0b5 (line ~33) in "threadCritical_solaris.cpp"
[4] Chunk::operator new(requested_size = ???, length = ???) (optimized), at 0xde989b52 (line ~179) in "allocation.cpp"
[5] Arena::grow(this = ???, x = ???) (optimized), at 0xde98a388 (line ~300) in "allocation.cpp"
[6] HandleArea::allocate_handle(this = ???, obj = ???) (optimized), at 0xdeb563f0 (line ~17) in "handles.cpp"
[7] Handle::Handle(this = ???, thread = ???, obj = ???) (optimized), at 0xdeb564f9 (line ~25) in "handles.cpp"
[8] jniIdSupport::to_jmethod_id_or_null(method_oop = ???) (optimized), at 0xdec45254 (line ~873) in "jniId.cpp"
[9] methodOopDesc::find_jmethod_id_or_null(this = ???) (optimized), at 0xdeecbcb7 (line ~820) in "methodOop.cpp"
[10] forte_fill_call_trace_given_top(thd = ???, trace = ???, depth = ???, top_frame = CLASS) (optimized), at 0xdeb11cff (line ~665) in "forte.cpp"
[11] AsyncGetCallTrace(trace = ???, depth = ???, ucontext = ???) (optimized), at 0xdeb121ac (line ~837) in "forte.cpp"
[12] profhandler(sig = 29, siginfo = 0x80453c4, ucontext = 0x80451c4), line 171 in "b4757672.c"
[13] __sighndlr(0x1d, 0x80453c4, 0x80451c4, 0xde6112d0), at 0xdfb8269f
---- called from signal handler with signal 29 (SIGPROF) ------
[14] ThreadCritical::~ThreadCritical( this = ???) (optimized), at 0xdf01b2d2 (line ~52) in "threadCritical_solaris.cpp"
[15] Chunk::operator new(requested_size = ???, length = ???) (optimized), at 0xde989b84 (line ~179) in "allocation.cpp"
[16] Arena::grow(this = ???, x = ???) (optimized), at 0xde98a388 (line ~300) in "allocation.cpp"
[17] HandleArea::allocate_handle(this = ???, obj = ???) (optimized), at 0xdeb563f0 (line ~17) in "handles.cpp"
[18] Handle::Handle(this = ???, thread = ???, obj = ???) (optimized), at 0xdeb564f9 (line ~25) in "handles.cpp"
[19] SymbolTable::basic_add(this = ???, cp = CLASS, names_count = ???, names = ???, lengths = ???, cp_indices = ???, hashValues = ???, __the_thread__ = ???) (optimized), at 0xdefe9a8f (line ~131) in "symbolTable.cpp"
[20] SymbolTable::add(cp = CLASS, names_count = ???, names = ???, lengths = ???, cp_indices = ???, hashValues = ???, __the_thread__ = ???) (optimized), at 0xdefe960a (line ~64) in "symbolTable.cpp"
[21] ClassFileParser::parse_constant_pool_entries(this = ???, cp = CLASS, length = ???, __the_thread__ = ???) (optimized), at 0xdea37094 (line ~160) in "classFileParser.cpp"
[22] ClassFileParser::parse_constant_pool(this = ???, __the_thread__ = ???) (optimized), at 0xdea37f11 (line ~212) in "classFileParser.cpp"
...
This seems to be a very obvious deadlock in ThreadCritical. The PROF signal must
have hit right after this line in ~ThreadCritical
global_mut_owner = -1;
and before this line:
if (os::Solaris::mutex_unlock(&global_mut))
and we deadlock.
###@###.### 2005-04-04 20:54:43 GMT