RFR: 8139765: set_numeric_flag can call Flag::find_flag to determine the flag type
Dmitry Dmitriev
dmitry.dmitriev at oracle.com
Fri Oct 23 12:34:34 UTC 2015
Hi Gerard,
Thank you for the review and provided feedback!
I implement #2. Also, I change line 822 in arguments.cpp from "if
(!result) {" to "if (result == NULL) {".
About #1: I think we should leave "guarantee()" call in
CommandLineFlagsEx functions. guarantee() in this case ensures that flag
embedded in CommandLineFlagWithType is exist and with correct type. If
guarantee failed, then we have a conceptual error, since we try to call
improper CommandLineFlagsEx function, i.e. call
CommandLineFlagsEx::boolAtPut for intx flag. Without guarantee we will
get an error in case of bad flag type, but if the caller not check error
code, then flag will remain unchanged. Thus, I think that we need to
leave "guarantee()" in these APIs.
webrev.01: http://cr.openjdk.java.net/~ddmitriev/8139765/webrev.01/
<http://cr.openjdk.java.net/%7Eddmitriev/8139765/webrev.01/>
Thanks,
Dmitry
On 22.10.2015 18:55, gerard ziemski wrote:
> Wow, excellent idea for an optimization!
>
> I only have 2 feedback issues:
>
>
> #1 file globals.cpp
>
> Since we are refactoring CommandLineFlags::*AtPut() APIs in terms of
> one API, I think the "gurantee() call is no longer needed and is
> redundant?
>
> Ex. The guarantee() checks for NULL and type (line 839), but only
> reports "wrong flag type" vs the API impl (lines 819,820) checks them
> separately and reports problem more accurately.
>
> I believe we are better served by removing the "guarantee" call
> completely from those APIs - those checks are performed elsewhere.
>
>
> #2 file arguments.cpp
>
> This might be nit picking, but since we are optimizing the code, then
> perhaps instead of:
>
> if (A) {
> }
> if (B) {
> }
> if (C) {
> }...
>
> we should have:
>
> if (A) {
> } else if (B) {
> } else if (C) {
> }...
>
> This way if we have A we don't have to bother checking B or C.
>
> The compiler might optimize that code this way anyhow, but it would be
> nice to have this programmed explicitly.
>
>
> Very, very nice work and idea!
>
>
> cheers
>
> On 10/21/2015 10:40 AM, Dmitry Dmitriev wrote:
>> Hello,
>>
>> Please review enhancement of set_numeric_flag function in
>> arguments.cpp module.
>> Current implementation of this function not determine the flag type
>> and delegate this to the
>> CommandLineFlags::<type>AtPut methods. If method succeed, then flag
>> was processed. Otherwise try next type and so on.
>> The bad thing that CommandLineFlags::<type>AtPut calls
>> Flag::find_flag to find the flag and check his type. Thus, for
>> size_t flag this operation will be repeated 6 times until appropriate
>> CommandLineFlags::<type>AtPut found the flag.
>>
>> In this enhancement I add CommandLineFlags::<type>AtPut which accepts
>> 'Flag*' argument. Other
>> CommandLineFlags::<type>AtPut now calls method with 'Flag*' argument.
>> In this case duplicated code was deleted for
>> CommandLineFlags::<type>AtPut and CommandLineFlagsEx::<type>AtPut
>> methods. New method for ccstrAtPut was not added
>> because it not needed and CommandLineFlags and CommandLineFlagsEx
>> have slightly different logic.
>>
>> And finally set_numeric_flag function was modified to use
>> CommandLineFlags::<type>AtPut with 'Flag*' argument. First of
>> all set_numeric_flag looking for the flag by Flag::find_flag
>> function. And then determine the flag type and call
>> appropriate method. In this case we call Flag::find_flag function
>> only once.
>>
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8139765
>> webrev.00: http://cr.openjdk.java.net/~ddmitriev/8139765/webrev.00/
>> <http://cr.openjdk.java.net/%7Eddmitriev/8139765/webrev.00/>
>> Testing: JPRT(hotspot test set), hotspot all, vm.quick
>>
>> Thanks,
>> Dmitry
>>
More information about the hotspot-runtime-dev
mailing list