Mercurial > hg > graal-jvmci-8
comparison src/share/vm/services/threadService.cpp @ 8673:5ee250974db9
8007476: assert(the_owner != NULL) failed: Did not find owning Java thread for lock word address
Summary: Make deadlock detection a little more robust in the case of being unable to find the JavaThread associated with an object lock.
Reviewed-by: sla, acorn
author | dcubed |
---|---|
date | Wed, 27 Feb 2013 15:00:30 -0800 |
parents | d8ce2825b193 |
children | ef748153ee8f |
comparison
equal
deleted
inserted
replaced
8671:698b615a1cde | 8673:5ee250974db9 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
325 waitingToLockBlocker = jt->current_park_blocker(); | 325 waitingToLockBlocker = jt->current_park_blocker(); |
326 } | 326 } |
327 while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) { | 327 while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) { |
328 cycle->add_thread(currentThread); | 328 cycle->add_thread(currentThread); |
329 if (waitingToLockMonitor != NULL) { | 329 if (waitingToLockMonitor != NULL) { |
330 currentThread = Threads::owning_thread_from_monitor_owner((address)waitingToLockMonitor->owner(), | 330 currentThread = Threads::owning_thread_from_monitor_owner( |
331 false /* no locking needed */); | 331 (address)waitingToLockMonitor->owner(), |
332 false /* no locking needed */); | |
333 if (currentThread == NULL) { | |
334 // This function is called at a safepoint so the JavaThread | |
335 // that owns waitingToLockMonitor should be findable, but | |
336 // if it is not findable, then the previous currentThread is | |
337 // blocked permanently. We record this as a deadlock. | |
338 num_deadlocks++; | |
339 | |
340 cycle->set_deadlock(true); | |
341 | |
342 // add this cycle to the deadlocks list | |
343 if (deadlocks == NULL) { | |
344 deadlocks = cycle; | |
345 } else { | |
346 last->set_next(cycle); | |
347 } | |
348 last = cycle; | |
349 cycle = new DeadlockCycle(); | |
350 break; | |
351 } | |
332 } else { | 352 } else { |
333 if (concurrent_locks) { | 353 if (concurrent_locks) { |
334 if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) { | 354 if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) { |
335 oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker); | 355 oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker); |
336 currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL; | 356 currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL; |
839 } else { | 859 } else { |
840 // No Java object associated - a JVMTI raw monitor | 860 // No Java object associated - a JVMTI raw monitor |
841 owner_desc = " (JVMTI raw monitor),\n which is held by"; | 861 owner_desc = " (JVMTI raw monitor),\n which is held by"; |
842 } | 862 } |
843 currentThread = Threads::owning_thread_from_monitor_owner( | 863 currentThread = Threads::owning_thread_from_monitor_owner( |
844 (address)waitingToLockMonitor->owner(), false /* no locking needed */); | 864 (address)waitingToLockMonitor->owner(), |
865 false /* no locking needed */); | |
866 if (currentThread == NULL) { | |
867 // The deadlock was detected at a safepoint so the JavaThread | |
868 // that owns waitingToLockMonitor should be findable, but | |
869 // if it is not findable, then the previous currentThread is | |
870 // blocked permanently. | |
871 st->print("%s UNKNOWN_owner_addr=" PTR_FORMAT, owner_desc, | |
872 (address)waitingToLockMonitor->owner()); | |
873 continue; | |
874 } | |
845 } else { | 875 } else { |
846 st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)", | 876 st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)", |
847 (address)waitingToLockBlocker, | 877 (address)waitingToLockBlocker, |
848 (InstanceKlass::cast(waitingToLockBlocker->klass()))->external_name()); | 878 (InstanceKlass::cast(waitingToLockBlocker->klass()))->external_name()); |
849 assert(waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass()), | 879 assert(waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass()), |