RFR: 8334492: DiagnosticCommands (jcmd) should accept %p in output filenames and substitute PID [v5]
Johan Sjölen
jsjolen at openjdk.org
Sun Jul 21 08:58:35 UTC 2024
On Sat, 20 Jul 2024 12:06:33 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:
>> On top: We hug the `*`s next to the type in Hotspot, not next to the var name. So `DCmdArgument<FileArgument>* argument`. This is something to check for all new code.
>>
>> Pre-existing: The indentation of the if-block is wrong.
>>
>> Also, @SoniaZaldana, would you mind changing the code to this (does not include your change), the repetition just made me cringe 😅.
>>
>> ```c++
>> DCmdArgument<char*>* argument = nullptr;
>> if (strcmp(type, "STRING") == 0) {
>> argument = new DCmdArgument<char*>(name, desc, "STRING", mandatory, default_value);
>> } else if (strcmp(type, "NANOTIME") == 0) {
>> DCmdArgument<NanoTimeArgument>* argument = new DCmdArgument<NanoTimeArgument>(name, desc, "NANOTIME", mandatory, default_value);
>> } else if (strcmp(type, "JLONG") == 0) {
>> DCmdArgument<jlong>* argument = new DCmdArgument<jlong>(name, desc, "JLONG", mandatory, default_value);
>> } else if (strcmp(type, "BOOLEAN") == 0) {
>> DCmdArgument<bool>* argument = new DCmdArgument<bool>(name, desc, "BOOLEAN", mandatory, default_value);
>> } else if (strcmp(type, "MEMORYSIZE") == 0) {
>> DCmdArgument<MemorySizeArgument>* argument = new DCmdArgument<MemorySizeArgument>(name, desc, "MEMORY SIZE", mandatory, default_value);
>> } else if (strcmp(type, "STRINGARRAY") == 0) {
>> DCmdArgument<StringArrayArgument*>* argument = new DCmdArgument<StringArrayArgument*>(name, desc, "STRING SET", mandatory);
>> }
>>
>> if (argument != nullptr) {
>> if (isarg) {
>> parser->add_dcmd_argument(argument);
>> } else {
>> parser->add_dcmd_option(argument);
>> }
>> }
>
> @jdksjolen
>
>> Also, @SoniaZaldana, would you mind changing the code to this
>
> Even simpler (did not test, but you get my drift):
>
>
> #define ALL_TYPES_DO_XX(what) \
> what(char*, "STRING") \
> what(NanoTimeArgument, NANOTIME) \
> what(jlong, "JLONG")
> ... etc
>
> then
>
>
> #define XX(TYPE, NAME) \
> if (strcmp(type, NAME) == 0) { \
> DCmdArgument<TYPE>* argument = new DCmdArgument<TYPE>(name, desc, NAME, mandatory, mandatory, default_value); \
> }
> ALL_TYPES_DO_XX(XX)
> #undef XX
>
>
> ;-)
Sonia, my bad if you already know this stuff but since it's fairly esoteric knowledge nowadays I'd like to help you out in advance: Thomas is proposing the usage of a X macro https://en.wikipedia.org/wiki/X_macro
These can be found throughout Hotspot, you can find an example definition and usage in `logTag.hpp` and `logTag.cpp`.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/20198#discussion_r1685688287
More information about the hotspot-dev
mailing list