RFR: 8224878: Use JVMFlag parameters instead of name strings

Stefan Karlsson stefan.karlsson at oracle.com
Tue May 28 13:23:39 UTC 2019


Hi David,

On 2019-05-28 15:05, David Holmes wrote:
> Hi Stefan,
> 
> Just in relation to the find_flag(name) versus find_flag(name, len) 
> issue, I'm trying to see the simplest thing to "flip" so that it makes 
> more sense, but to be honest I don't understand why we use the 
> find_flag(name, len) form in the places that we do. For example:
> 
> JVMFlag::Error JVMFlag::boolAtPut(const char* name, size_t len, bool* 
> value, JVMFlag::Flags origin) {
>    JVMFlag* result = JVMFlag::find_flag(name, len);
>    return boolAtPut(result, value, origin);
> }
> 
> won't find a locked flag - but why not? I don't see why this should be a 
> function that only applies to unlocked flags. ??

The patch above actually removes that code:
-JVMFlag::Error JVMFlag::boolAtPut(const char* name, size_t len, bool* 
value, JVMFlag::Flags origin) {
-  JVMFlag* result = JVMFlag::find_flag(name, len);
-  return boolAtPut(result, value, origin);
-}

and left is the version that doesn't care if the flag is locked or not:
JVMFlag::Error JVMFlag::boolAtPut(JVMFlag* flag, bool* value, 
JVMFlag::Flags origin) {

However, now that you mention it, maybe that's unwise. Maybe we actually 
should check that we don't set locked (or is_constant_in_binary) flags.

> 
> But given we are talking about locked versus unlocked flags then 
> find_flag_unlocked() would seem more appropriate than 
> find_flag_unconstrained().

There's an extra dimension to this:

  896 // Search the flag table for a named flag
  897 JVMFlag* JVMFlag::find_flag(const char* name, size_t length, bool 
allow_locked, bool return_flag) {
  898   for (JVMFlag* current = &flagTable[0]; current->_name != NULL; 
current++) {
  899     if (str_equal(current->_name, current->get_name_length(), 
name, length)) {
  900       // Found a matching entry.
  901       // Don't report notproduct and develop flags in product builds.
  902       if (current->is_constant_in_binary()) {
  903         return (return_flag ? current : NULL);
  904       }
  905       // Report locked flags only if allowed.
  906       if (!(current->is_unlocked() || current->is_unlocker())) {
  907         if (!allow_locked) {
  908           // disable use of locked flags, e.g. diagnostic, 
experimental,
  909           // etc. until they are explicitly unlocked
  910           return NULL;
  911         }
  912       }
  913       return current;
  914     }
  915   }
  916   // JVMFlag name is not in the flag table
  917   return NULL;
  918 }

it's not only locked flags that get returned. See lines 902-903. Do you 
still think find_flag_unlocked would be a better name?

> 
> More tomorrow ...

Thanks,
StefanK

> 
> Cheers,
> David
> 
> On 28/05/2019 10:44 pm, Stefan Karlsson wrote:
>> And here's the webrev:
>>   http://cr.openjdk.java.net/~stefank/8224878/webrev.01/
>>
>> Thanks,
>> StefanK
>>
>> On 2019-05-28 13:35, Stefan Karlsson wrote:
>>> Hi all,
>>>
>>> Please review this patch to use JVMFlag parameters instead of name 
>>> strings in the JVM flag handling code.
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8224878
>>>
>>> The intention is to reduce the places where the API uses "const char* 
>>> name" parameters to describe a JVM flag, and instead use a JVMFlag* 
>>> when performing various flag handling code. The places where we 
>>> translate from "const char* name" to JVMFlag* has been pushed to the 
>>> outer layers of the code, which explicitly uses the 
>>> JVMFlag::find_flag functions.
>>>
>>> This allows us to replace strcmp with simple JVMFlag pointer equality 
>>> checks in jvmFlagRangeList.cpp and jvmFlagConstraintList.cpp.
>>>
>>> This gets rid of the need to store a typed pointer to the flag in 
>>> jvmFlagRangeList.cpp and jvmFlagConstraintList.cpp.
>>>
>>> This gets rid of the the need to propagate the 'allow_locked' and 
>>> 'return_flag' parameters down the call chain. For example, see the 
>>> changes to JVMFlag::<type>At and JVMFlag::<type>AtPut:
>>> -  static JVMFlag::Error intAt(const char* name, int* value, bool 
>>> allow_locked = false, bool return_flag = false)      { return 
>>> intAt(name, strlen(name), value, allow_locked, return_flag); }
>>> +  static JVMFlag::Error intAt(const JVMFlag* flag, int* value);
>>>    static JVMFlag::Error intAtPut(JVMFlag* flag, int* value, 
>>> JVMFlag::Flags origin);
>>> -  static JVMFlag::Error intAtPut(const char* name, size_t len, int* 
>>> value, JVMFlag::Flags origin);
>>> -  static JVMFlag::Error intAtPut(const char* name, int* value, 
>>> JVMFlag::Flags origin)   { return intAtPut(name, strlen(name), value, 
>>> origin); }
>>>
>>>   It changes the JVMFlag::find_flag API. The way it uses default 
>>> values have a surprising effect for users of those functions. 
>>> find_flag(name) searches among all flags (even locked and constants), 
>>> while find_flag(name, strlen(name)) doesn't return locked or 
>>> constants flags. To make it less likely to accidentally call the 
>>> wrong version, this has been changed to the following:
>>> * JVMFlag::find_flag(name) - Fetches the flag if it is available 
>>> (unlocked and not constant).
>>> * JVMFlag::find_flag_unrestricted(name) - Fetches the flag even if it 
>>> is locked or a constant.
>>>
>>> Removed the unused JVMFlag::wasSetOnCmdline.
>>>
>>> Small cleanups
>>> - Renamed address_of_flag to flag_from_enum
>>> - Renamed local JVMFlag* variable from results to flag
>>> - Use initializer lists
>>> - Removed superfluous semicolons
>>>
>>> I don't mind splitting patch up into more than one RFE, if that seems 
>>> more appropriate.
>>>
>>> Tested with:
>>> - test/hotspot/jtreg/runtime/CommandLine
>>> - tier1 (tier2-3 80% done)
>>>
>>> Suggestions on other testing is appreciated.
>>>
>>> Thanks,
>>> StefanK


More information about the hotspot-runtime-dev mailing list