jmx-dev RFR: 8264285: Clean the modification of ccstr JVM flags [v2]
David Holmes
david.holmes at oracle.com
Thu Apr 1 06:35:59 UTC 2021
On 1/04/2021 4:19 pm, Ioi Lam wrote:
>
>
> On 3/31/21 10:47 PM, David Holmes wrote:
>> On 1/04/2021 3:29 pm, Ioi Lam wrote:
>>>
>>>
>>> On 3/31/21 10:22 PM, David Holmes wrote:
>>>> On 1/04/2021 5:05 am, Ioi Lam wrote:
>>>>> On Wed, 31 Mar 2021 12:58:50 GMT, Coleen Phillimore
>>>>> <coleenp at openjdk.org> wrote:
>>>>>
>>>>>>
>>>>>>> 36: // have any MANAGEABLE flags of the ccstr type, but we really
>>>>>>> need to
>>>>>>> 37: // make sure the implementation is correct (in terms of
>>>>>>> memory allocation)
>>>>>>> 38: // just in case someone may add such a flag in the future.
>>>>>>
>>>>>> Could you have just added a develop flag to the manageable flags
>>>>>> instead?
>>>>>
>>>>> I had to use a `product` flag due to the following code, which
>>>>> should have been removed as part of
>>>>> [JDK-8243208](https://bugs.openjdk.java.net/browse/JDK-8243208),
>>>>> but I was afraid to do so because I didn't have a test case. I.e.,
>>>>> all of our diagnostic/manageable/experimental flags were `product`
>>>>> flags.
>>>>>
>>>>> With this PR, now I have a test case -- I changed
>>>>> `DummyManageableStringFlag` to a `notproduct` flag, and removed the
>>>>> following code. I am re-running tiers1-4 now.
>>>>
>>>> Sorry but I don't understand how a test involving one flag replaces
>>>> a chunk of code that validated every flag declaration ??
>>>>
>>>
>>> When I did JDK-8243208, I wasn't sure if the VM would actually
>>> support diagnostic/manageable/experimental flags that were not
>>> `product`. So I added check_all_flag_declarations() to prevent anyone
>>> from adding such a flag "casually" without thinking about.
>>>
>>> Now that I have added such a flag, and I believe I have tested pretty
>>> thoroughly (tiers 1-4), I think the VM indeed supports these flags.
>>> So now I feel it's safe to remove check_all_flag_declarations().
>>
>> But the check was checking two things:
>>
>> 1. That diagnostic/manageable/experimental are mutually exclusive
>> 2. That they only apply to product flags
>>
>> I believe both of these rules still stand based on what we defined
>> such attributes to mean. And even if you think #2 should not apply, #1
>> still does and so could still be checked. And if #2 is no longer our
>> rule then the documentation in globals.hpp should be updated - though
>> IMHO #2 should remain as-is.
>>
>
> I think neither #1 and #2 make sense. These were limitation introduced
> by the old flags implementation, where you had to declare a flag using
> one of these macros
>
> diagnostic(type, name, ....
> manageable(type, name, ....
> experimental(type, name, ....
>
> That's why you have #1 (mutual exclusion).
>
> #2 was also due to the implementation. It makes no sense that you can't
> have an develop flag for an experimental feature.
I don't agree with either of those claims. This is about semantics not
implementation. diagnostic/manageable/experimental are distinct kinds of
product flags with different levels of "support" based on their intended
use in the product. We don't need such distinctions with non-product
flags because the level of "support" is all the same and all flags are
equal.
David
-----
> However, in the old implementation, adding more variations would cause
> macro explosion. See
> https://github.com/openjdk/jdk/blame/7d8519fffe46b6b5139b3aa51b18fcf0249a9e14/src/hotspot/share/runtime/flags/jvmFlag.cpp#L776
>
>
> Anyway, changing this should be done in a separate RFE. I have reverted
> [v2] from this PR, so we are back to [v1].
>
> Thanks
> - Ioi
>
>
>> David
>> -----
>>
>>
>>> Thanks
>>> - Ioi
>>>
>>>
>>>
>>>> David
>>>> -----
>>>>
>>>>> void JVMFlag::check_all_flag_declarations() {
>>>>> for (JVMFlag* current = &flagTable[0]; current->_name != NULL;
>>>>> current++) {
>>>>> int flags = static_cast<int>(current->_flags);
>>>>> // Backwards compatibility. This will be relaxed/removed in
>>>>> JDK-7123237.
>>>>> int mask = JVMFlag::KIND_DIAGNOSTIC | JVMFlag::KIND_MANAGEABLE
>>>>> | JVMFlag::KIND_EXPERIMENTAL;
>>>>> if ((flags & mask) != 0) {
>>>>> assert((flags & mask) == JVMFlag::KIND_DIAGNOSTIC ||
>>>>> (flags & mask) == JVMFlag::KIND_MANAGEABLE ||
>>>>> (flags & mask) == JVMFlag::KIND_EXPERIMENTAL,
>>>>> "%s can be declared with at most one of "
>>>>> "DIAGNOSTIC, MANAGEABLE or EXPERIMENTAL",
>>>>> current->_name);
>>>>> assert((flags & KIND_NOT_PRODUCT) == 0 &&
>>>>> (flags & KIND_DEVELOP) == 0,
>>>>> "%s has an optional DIAGNOSTIC, MANAGEABLE or
>>>>> EXPERIMENTAL "
>>>>> "attribute; it must be declared as a product flag",
>>>>> current->_name);
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> -------------
>>>>>
>>>>> PR: https://git.openjdk.java.net/jdk/pull/3254
>>>>>
>>>
>
More information about the jmx-dev
mailing list