提交 6e29dfc3 编写于 作者: C coleenp

6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock

Summary: Don't acquire methodData_lock while holding pending list lock
Reviewed-by: kvn, never, ysr
上级 e53f8ecf
...@@ -457,6 +457,11 @@ void instanceRefKlass::oop_verify_on(oop obj, outputStream* st) { ...@@ -457,6 +457,11 @@ void instanceRefKlass::oop_verify_on(oop obj, outputStream* st) {
} }
} }
bool instanceRefKlass::owns_pending_list_lock(JavaThread* thread) {
Handle h_lock(thread, java_lang_ref_Reference::pending_list_lock());
return ObjectSynchronizer::current_thread_holds_lock(thread, h_lock);
}
void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) { void instanceRefKlass::acquire_pending_list_lock(BasicLock *pending_list_basic_lock) {
// we may enter this with pending exception set // we may enter this with pending exception set
PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument PRESERVE_EXCEPTION_MARK; // exceptions are never thrown, needed for TRAPS argument
......
...@@ -89,6 +89,7 @@ class instanceRefKlass: public instanceKlass { ...@@ -89,6 +89,7 @@ class instanceRefKlass: public instanceKlass {
static void release_and_notify_pending_list_lock(BasicLock *pending_list_basic_lock); static void release_and_notify_pending_list_lock(BasicLock *pending_list_basic_lock);
static void acquire_pending_list_lock(BasicLock *pending_list_basic_lock); static void acquire_pending_list_lock(BasicLock *pending_list_basic_lock);
static bool owns_pending_list_lock(JavaThread* thread);
// Update non-static oop maps so 'referent', 'nextPending' and // Update non-static oop maps so 'referent', 'nextPending' and
// 'discovered' will look like non-oops // 'discovered' will look like non-oops
......
...@@ -309,6 +309,12 @@ void methodOopDesc::print_invocation_count() { ...@@ -309,6 +309,12 @@ void methodOopDesc::print_invocation_count() {
// Build a methodDataOop object to hold information about this method // Build a methodDataOop object to hold information about this method
// collected in the interpreter. // collected in the interpreter.
void methodOopDesc::build_interpreter_method_data(methodHandle method, TRAPS) { void methodOopDesc::build_interpreter_method_data(methodHandle method, TRAPS) {
// Do not profile method if current thread holds the pending list lock,
// which avoids deadlock for acquiring the MethodData_lock.
if (instanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) {
return;
}
// Grab a lock here to prevent multiple // Grab a lock here to prevent multiple
// methodDataOops from being created. // methodDataOops from being created.
MutexLocker ml(MethodData_lock, THREAD); MutexLocker ml(MethodData_lock, THREAD);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册