RFR: 8274687: JDWP deadlocks if some Java thread reaches wait in blockOnDebuggerSuspend
Richard Reingruber
rrich at openjdk.java.net
Thu Oct 7 14:20:26 UTC 2021
This change fixes deadlocks described in the JBS-bug by:
* Releasing `handlerLock` before waiting on `threadLock` in `blockOnDebuggerSuspend()`
* Notifying on `threadLock` in `threadControl_reset()`
Also the actions in handleAppResumeBreakpoint() are moved/deferred until
doPendingTasks() runs. This is necessary because an event handler must not
release handlerLock first and foremost because handlers are called while
iterating the handler chain for an event type which is protected by handlerLock
(see https://github.com/openjdk/jdk/pull/5805)
The first commit delays the cleanup actions after leaving the loop in
`debugLoop_run()`. It allows to reproduce the deadlock running the dispose003
test with the command
make run-test TEST=test/hotspot/jtreg/vmTestbase/nsk/jdi/VirtualMachine/dispose/dispose003
The second commit adds a new test that reproduces the deadlock when calling
threadControl_resumeThread() while a thread is waiting in
blockOnDebuggerSuspend().
The third commit contains the fix described above. With it the deadlocks
cannot be reproduced anymore.
The forth commit removes the diagnostic code introduced with the first commit again.
The fix passed
test/hotspot/jtreg/serviceability/jdwp
test/jdk/com/sun/jdi
test/hotspot/jtreg/vmTestbase/nsk/jdwp
test/hotspot/jtreg/vmTestbase/nsk/jdi
-------------
Commit messages:
- Remove delay in cleanup again.
- Fix that prevents deadlocks.
- New test that deadlocks target VM calling ThreadReference.resume().
- Delay cleanup after JDWP Dispose command to trigger deadlock in the test dispose003
Changes: https://git.openjdk.java.net/jdk/pull/5849/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5849&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8274687
Stats: 280 lines in 2 files changed: 262 ins; 13 del; 5 mod
Patch: https://git.openjdk.java.net/jdk/pull/5849.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/5849/head:pull/5849
PR: https://git.openjdk.java.net/jdk/pull/5849
More information about the serviceability-dev
mailing list