[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-serviceability-dev
Subject: Integrated: 8269542: JDWP: EnableCollection support is no longer spec compliant after JDK-8255987
From: Chris Plummer <cjplummer () openjdk ! java ! net>
Date: 2022-01-25 19:29:41
Message-ID: mJ7-Eu6A5HyD7IGQRwgYxZPL7dzUBO_ZYd6hJW2cELo=.ef64b286-0d46-4468-9836-907704b58723 () github ! com
[Download RAW message or body]
On Tue, 18 Jan 2022 20:25:41 GMT, Chris Plummer <cjplummer@openjdk.org> wrote:
> The JDWP spec mentions nothing about `DisableCollection` and `EnableCollection` \
> tracking the depth or nesting of the commands. This means that `EnableCollection` \
> should enable collection no matter how many `DisableCollection` commands were done \
> before it. This is how the debug agent used to work before \
> [JDK-8255987](https://bugs.openjdk.java.net/browse/JDK-8255987). Now the commands' \
> nesting level is tracked, meaning that if there are two `DisableCollection` \
> commands, you need two `EnableCollection` commands to re-enable collection. This is \
> contrary to what the spec says. Only one `EnableCollection` command should be \
> needed to undo any number of `DisableCollection` commands.
> Note, JDWP differs from JDI here. The JDI spec explicitly says you need an enable \
> for each disable in order to enable collection again. JDI tracks the disable count. \
> Also, JDI only does the JDWP `DisableCollection` for the first disable, and only \
> does the JDWP `EnableCollection` when the count goes back to 0. For this reason \
> this JDWP bug cannot be reproduced by using JDI. You have to use JDWP directly. \
> Unfortunately we have very limited direct testing of JDWP. JDWP testing mostly is \
> done via JDI. What little JDWP testing we do have pretty much just verifies that \
> reply packets are as expected. They don't verify VM or application behavior. For \
> example, we have no JDWP test that tests that `DisableCollection` actually disables \
> the collecting of the object. For this reason I have not added a test for this CR.
> Another issue is that support for `DisableCollection/EnableCollection` nesting was \
> intermixed with the support for having `VM.Suspend` disable collection on all \
> objects (which was the main purpose of \
> [JDK-8255987](https://bugs.openjdk.java.net/browse/JDK-8255987)). As a result, if \
> you do a `VM.Suspend` and then do a `DisableCollection` on an `ObjectReference`, \
> that object can now be collected, even though the spec says it should not be during \
> a `VM.Suspend`. This issues is documented in \
> [JDK-8258071](https://bugs.openjdk.java.net/browse/JDK-8258071), and is also fixed \
> by this PR.
> To fix both of these issues, `node->strongCount` should go back to being a boolean \
> (`node->isStrong`) like it was before \
> [JDK-8255987](https://bugs.openjdk.java.net/browse/JDK-8255987). Also, separate \
> flags should be maintained to indicate if the reference is strong due to a \
> `DisableCollection` and/or due to `VM.Suspend`. We need a flag for each, because \
> it's possible that both can be true at the same time. When `node->isStrong` is \
> true, if there is an `EnableCollection` it only gets set false if there is no \
> current `VM.Suspend`. Likewise was if `VM.Resume` is done, it only gets set false \
> if there is no outstanding `DisableCollection`.
> There should be no need for maintaining a count anymore since we aren't suppose to \
> for `DisableCollection/EnableCollection`, and there is no need to for \
> `VM.Suspend/Resume`, since it only calls `commonRef_pinAll()` code when the \
> `suspendAllCount` is changed to/from 0.
> Please also note [JDK-8269232](https://bugs.openjdk.java.net/browse/JDK-8269232), \
> which was also introduced by this nesting level counting, but is being fixed in \
> more direct manner to keep the changes simple. The fix for CR replaces the changes \
> for [JDK-8269232](https://bugs.openjdk.java.net/browse/JDK-8269232).
This pull request has now been integrated.
Changeset: 841eae6f
Author: Chris Plummer <cjplummer@openjdk.org>
URL: https://git.openjdk.java.net/jdk/commit/841eae6f527c00115e0455c4e04f042c28a014bb
Stats: 53 lines in 2 files changed: 23 ins; 5 del; 25 mod
8269542: JDWP: EnableCollection support is no longer spec compliant after JDK-8255987
8258071: Fix for JDK-8255987 can be subverted with ObjectReference.EnableCollection
Reviewed-by: dholmes, pliden
-------------
PR: https://git.openjdk.java.net/jdk/pull/7134
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic