RFR (S): 8219023: Investigate syncing JVMTI spec version with JDK version
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Tue May 14 10:12:40 UTC 2019
Hi David,
Thank you a lot!
Serguei
On 5/14/19 00:13, David Holmes wrote:
> Hi Serguei,
>
> For the delay in getting back to this. Everything seems fine to me now.
>
> Thanks,
> David
> -----
>
> On 10/05/2019 7:16 pm, serguei.spitsyn at oracle.com wrote:
>> Hi David,
>>
>> I've noticed a minor problem in the jvmti.html diff below:
>>
>> 5c5
>> < <title>JVM(TM) Tool Interface 11.0.0</title>
>> ---
>> > <title>JVM(TM) Tool Interface 13.0.0</title>
>> 30c30
>> < <h3>Version 11.0</h3>
>> ---
>> > <h3>Version 13.0</h3>
>> 34931c34931
>> < Version: 11.0.0
>> ---
>> > Version: 13.0.0
>>
>>
>> There should not be the last difference as this is the version of
>> last JVMTI spec update:
>>
>> *11.0.0*
>> 7 February 2018 Minor update for new class file NestHost and
>> NestMembers attributes: - Specify that RedefineClasses and
>> RetransformClasses are not allowed to change the class file NestHost
>> and NestMembers attributes. - Add new error
>> JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED that can
>> be returned by RedefineClasses and RetransformClasses.
>>
>>
>>
>> I've updated the webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2019/8219023-svc-version.3/
>>
>> The newly updated file is:
>> || src/hotspot/share/prims/jvmti.xml
>>
>> which has this change:
>>
>> +<xsl:template name="lastchangeversion">
>> + <xsl:for-each select="//change">
>> + <xsl:if test="position() = last()">
>> + <xsl:value-of select="@version"/>
>> + </xsl:if>
>> + </xsl:for-each>
>> +</xsl:template>
>> +
>> <xsl:template match="changehistory">
>> <div class="sep"/>
>> <hr class="thick"/>
>> <h2>Change History</h2>
>> Last update: <xsl:value-of select="@update"/><br/>
>> - Version: <xsl:call-template name="showversion"/>
>> + Version: <xsl:call-template name="lastchangeversion"/>
>>
>>
>> New jvmti.html diff is:
>> 5c5
>> < <title>JVM(TM) Tool Interface 11.0.0</title>
>> ---
>> > <title>JVM(TM) Tool Interface 13.0.0</title>
>> 30c30
>> < <h3>Version 11.0</h3>
>> ---
>> > <h3>Version 13.0</h3>
>>
>>
>> Thanks,
>> Serguei
>>
>>
>> On 5/10/19 01:03, serguei.spitsyn at oracle.com wrote:
>>> Hi David,
>>>
>>>
>>> On 5/9/19 18:51, David Holmes wrote:
>>>> Hi Serguei,
>>>>
>>>> On 10/05/2019 10:32 am, serguei.spitsyn at oracle.com wrote:
>>>>> I've updated the webrev v2 in place.
>>>>
>>>> make/hotspot/gensrc/GensrcJvmti.gmk
>>>>
>>>> You don't need to pass through: -PARAM minorversion $(VERSION_INTERIM)
>>>
>>> Good catch.
>>> How did I missed to remove?
>>>
>>>
>>>> src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerImpl.java
>>>>
>>>>
>>>> 57 private static final int minorVersion =
>>>> Runtime.version().interim();
>>>>
>>>> That should be kept at 0.
>>>
>>> Okay, fixed.
>>>
>>> New webrev is:
>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2019/8219023-svc-version.3/
>>>
>>>
>>>
>>>>
>>>> I'd like to see an actual diff of the generated jvmti.h and
>>>> jvmti.html files as well please. Some of the XSL stuff looks odd to
>>>> me.
>>>
>>> The jvmti.h diff:
>>>
>>> 2c2
>>> < * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All
>>> rights reserved.
>>> ---
>>> > * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All
>>> rights reserved.
>>> 47c47
>>> < JVMTI_VERSION = 0x30000000 + (11 * 0x10000) + (0 * 0x100) + 0
>>> /* version: 11.0.0 */
>>> ---
>>> > JVMTI_VERSION = 0x30000000 + (13 * 0x10000) + ( 0 * 0x100) +
>>> 0 /* version: 13.0.0 */
>>>
>>>
>>>
>>> The jvmti.html diff:
>>>
>>> 5c5
>>> < <title>JVM(TM) Tool Interface 11.0.0</title>
>>> ---
>>> > <title>JVM(TM) Tool Interface 13.0.0</title>
>>> 30c30
>>> < <h3>Version 11.0</h3>
>>> ---
>>> > <h3>Version 13.0</h3>
>>> 34931c34931
>>> < Version: 11.0.0
>>> ---
>>> > Version: 13.0.0
>>>
>>>
>>>
>>> Thanks,
>>> Serguei
>>>
>>>>
>>>> Thanks,
>>>> David
>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>
>>>>> On 5/9/19 17:28, serguei.spitsyn at oracle.com wrote:
>>>>>> David and Jc,
>>>>>>
>>>>>> Okay, I'll remove this line now.
>>>>>> Thank you for your comments.
>>>>>>
>>>>>> Let's let Jc to file a separate enhancement on this.
>>>>>> Then I'll file a CSR and prepare a fix.
>>>>>>
>>>>>> I hope, you both are Okay with the rest.
>>>>>>
>>>>>> Thanks!
>>>>>> Serguei
>>>>>>
>>>>>>
>>>>>> On 5/9/19 17:17, Jean Christophe Beyler wrote:
>>>>>>> Hi Serguei,
>>>>>>>
>>>>>>> Adding to the difficulties that David is exposing, this won't
>>>>>>> work. You need to redo the xls definition because you need the
>>>>>>> #define to be the numeric value directly and not the enum;
>>>>>>> otherwise it won't work in any usable way at preprocessor time
>>>>>>> sadly.
>>>>>>>
>>>>>>> I think it makes sense to just do what you were planning to do
>>>>>>> here without this and I'll file a bug and work out the CSR path
>>>>>>> and review path separately and see what is do-able or not then
>>>>>>> because I think it's too much work now "just for this now" if
>>>>>>> that makes sense :)
>>>>>>> Jc
>>>>>>>
>>>>>>> *From: *David Holmes <david.holmes at oracle.com
>>>>>>> <mailto:david.holmes at oracle.com>>
>>>>>>> *Date: *Thu, May 9, 2019 at 5:11 PM
>>>>>>> *To: *serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>, Jean Christophe Beyler
>>>>>>> *Cc: *serviceability-dev
>>>>>>>
>>>>>>> On 10/05/2019 9:45 am, serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com> wrote:
>>>>>>> > Hi Jc,
>>>>>>> >
>>>>>>> > Okay, you convinced me - thanks!
>>>>>>> > Added new line into the generated jvmti.h:
>>>>>>> >
>>>>>>> > #define JVMTI_VERSION_LATEST JVMTI_VERSION
>>>>>>>
>>>>>>> That requires a CSR as you are expanding the exported
>>>>>>> interface.
>>>>>>>
>>>>>>> Also you need
>>>>>>>
>>>>>>> #define JVMTI_VERSION_LATEST (JVMTI_VERSION)
>>>>>>>
>>>>>>> as JVMTI_VERSION is itself an expression not a constant.
>>>>>>> That might
>>>>>>> limit the utility of having such a define as you won't be
>>>>>>> able to
>>>>>>> use it
>>>>>>> in an ifdef guard to test a value AFAICS.
>>>>>>>
>>>>>>> David
>>>>>>>
>>>>>>> > I hope, it will help in your case.
>>>>>>> >
>>>>>>> >
>>>>>>> > Updated webrev version is:
>>>>>>> >
>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2019/8219023-svc-version.2/
>>>>>>>
>>>>>>> >
>>>>>>> >
>>>>>>> > This version includes suggestions from David.
>>>>>>> >
>>>>>>> > Thanks,
>>>>>>> > Serguei
>>>>>>> >
>>>>>>> >
>>>>>>> >
>>>>>>> > On 5/9/19 14:17, Jean Christophe Beyler wrote:
>>>>>>> >> Hi Serguei,
>>>>>>> >>
>>>>>>> >> Of course I can :)
>>>>>>> >>
>>>>>>> >> Consider, just randomly of course, the heap sampling work
>>>>>>> that
>>>>>>> got
>>>>>>> >> added to JVMTI. Now imagine you'd want to test if it is
>>>>>>> supported by a
>>>>>>> >> given JVMTI version, you would write something like this:
>>>>>>> >>
>>>>>>> >> bool HeapMonitor::Supported(jvmtiEnv *jvmti) {
>>>>>>> >> jvmtiCapabilities caps;
>>>>>>> >> memset(&caps, 0, sizeof(caps));
>>>>>>> >> if (jvmti->GetPotentialCapabilities(&caps) !=
>>>>>>> JVMTI_ERROR_NONE) {
>>>>>>> >> LOG(WARNING) << "Failed to get potential capabilities,
>>>>>>> disabling
>>>>>>> >> the heap "
>>>>>>> >> << "sampling monitor";
>>>>>>> >> return false;
>>>>>>> >> }
>>>>>>> >>
>>>>>>> >> return caps.can_generate_sampled_object_alloc_events
>>>>>>> >> && caps.can_generate_garbage_collection_events;
>>>>>>> >> }
>>>>>>> >>
>>>>>>> >> Now, the problem is that this code cannot be used if you
>>>>>>> compile with
>>>>>>> >> an older JDK such as JDK8 for example
>>>>>>> >> because can_generate_sampled_object_alloc_events does not
>>>>>>> exist yet
>>>>>>> >> for that jvmti.h file.
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> In a perfect world, we might imagine that we are always
>>>>>>> compiling with
>>>>>>> >> the latest JVMTI headers but that is not always true and,
>>>>>>> therefore,
>>>>>>> >> to have the code portable, we now have to do:
>>>>>>> >>
>>>>>>> >> bool HeapMonitor::Supported(jvmtiEnv *jvmti) {
>>>>>>> >> #ifdef ENABLE_HEAP_SAMPLING
>>>>>>> >> jvmtiCapabilities caps;
>>>>>>> >> memset(&caps, 0, sizeof(caps));
>>>>>>> >> if (jvmti->GetPotentialCapabilities(&caps) !=
>>>>>>> JVMTI_ERROR_NONE) {
>>>>>>> >> LOG(WARNING) << "Failed to get potential capabilities,
>>>>>>> disabling
>>>>>>> >> the heap "
>>>>>>> >> << "sampling monitor";
>>>>>>> >> return false;
>>>>>>> >> }
>>>>>>> >>
>>>>>>> >> return caps.can_generate_sampled_object_alloc_events
>>>>>>> >> && caps.can_generate_garbage_collection_events;
>>>>>>> >> #else
>>>>>>> >> return false;
>>>>>>> >> #endif
>>>>>>> >> }
>>>>>>> >>
>>>>>>> >> Where ENABLE_HEAP_SAMPLING is defined if we did compile with
>>>>>>> JDK11 and
>>>>>>> >> not defined if we compiled with JDK8. I can't use
>>>>>>> JVMTI_VERSION
>>>>>>> >> because I can't use it in an #if because it is not an enum.
>>>>>>> Were it to
>>>>>>> >> be a #define or were I to have a #define I could use with a
>>>>>>> version
>>>>>>> >> number being bumped up, I could write something such as:
>>>>>>> >>
>>>>>>> >> #ifdef JVMTI_VERSION_11
>>>>>>> >>
>>>>>>> >> or something that looks in the value of the JVMTI_VERSION
>>>>>>> if I
>>>>>>> wanted.
>>>>>>> >> Right now, I can't even do that!
>>>>>>> >>
>>>>>>> >> Hopefully this helps understand what I am talking about :-),
>>>>>>> >> Jc
>>>>>>> >>
>>>>>>> >>
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> On Thu, May 9, 2019 at 2:08 PM serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >> <mailto:serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>> <serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >> <mailto:serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>>> wrote:
>>>>>>> >>
>>>>>>> >> Hi Jc,
>>>>>>> >>
>>>>>>> >> Thank you a lot for review!
>>>>>>> >> Some replies below.
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> On 5/9/19 09:10, Jean Christophe Beyler wrote:
>>>>>>> >>> Hi Serguei,
>>>>>>> >>>
>>>>>>> >>> FWIW, the change looks good and I think it's a good
>>>>>>> idea
>>>>>>> to do.
>>>>>>> >>> However, there is one thorn in our internal agent
>>>>>>> code is
>>>>>>> that
>>>>>>> >>> the JVMTI_VERSION is in an enum. This makes us
>>>>>>> unable to
>>>>>>> #if it
>>>>>>> >>> when adding usages of newer features/methods.
>>>>>>> >>>
>>>>>>> >>> This probably could/should be a different webrev
>>>>>>> (which I
>>>>>>> can do
>>>>>>> >>> if you like) but is there any way while you are
>>>>>>> changing this
>>>>>>> >>> that the enum for JVMTI_VERSION could become a set of
>>>>>>> #define?
>>>>>>> >>>
>>>>>>> >>> So instead of:
>>>>>>> >>> enum {
>>>>>>> >>> JVMTI_VERSION_1 = 0x30010000,
>>>>>>> >>> JVMTI_VERSION_1_0 = 0x30010000,
>>>>>>> >>> JVMTI_VERSION_1_1 = 0x30010100,
>>>>>>> >>> JVMTI_VERSION_1_2 = 0x30010200,
>>>>>>> >>> JVMTI_VERSION_9 = 0x30090000,
>>>>>>> >>> JVMTI_VERSION_11 = 0x300B0000,
>>>>>>> >>>
>>>>>>> >>> JVMTI_VERSION = 0x30000000 + (11 * 0x10000) + (0 *
>>>>>>> 0x100) +
>>>>>>> >>> 0 /* version: 11.0.0 */
>>>>>>> >>> };
>>>>>>> >>>
>>>>>>> >>> We would get:
>>>>>>> >>> #define JVMTI_VERSION_1 0x30010000
>>>>>>> >>> #define JVMTI_VERSION_1_0 0x30010000
>>>>>>> >>> #define JVMTI_VERSION_1_1 = 0x30010100
>>>>>>> >>> #define JVMTI_VERSION_1_2 = 0x30010200
>>>>>>> >>> #define JVMTI_VERSION_9 = 0x30090000
>>>>>>> >>> #define JVMTI_VERSION_11 = 0x300B0000
>>>>>>> >>> #define JVMTI_VERSION (0x30000000 + (11 * 0x10000) +
>>>>>>> (0 *
>>>>>>> 0x100)
>>>>>>> >>> + 0 /* version: 11.0.0 */)
>>>>>>> >>
>>>>>>> >> It is interesting concern and suggestion.
>>>>>>> >> I'm not sure if it requires a CSR.
>>>>>>> >>
>>>>>>> >>
>>>>>>> >>> I actually don't care about any define of these
>>>>>>> except for
>>>>>>> >>> JVMTI_VERSION; basically it would be useful so that in
>>>>>>> our agent
>>>>>>> >>> code we can test the JVMTI_VERSION with #if macros to
>>>>>>> protect the
>>>>>>> >>> code when new elements show up in future versions.
>>>>>>> So it also
>>>>>>> >>> could be:
>>>>>>> >>> enum {
>>>>>>> >>> JVMTI_VERSION_1 = 0x30010000,
>>>>>>> >>> JVMTI_VERSION_1_0 = 0x30010000,
>>>>>>> >>> JVMTI_VERSION_1_1 = 0x30010100,
>>>>>>> >>> JVMTI_VERSION_1_2 = 0x30010200,
>>>>>>> >>> JVMTI_VERSION_9 = 0x30090000,
>>>>>>> >>> JVMTI_VERSION_11 = 0x300B0000,
>>>>>>> >>>
>>>>>>> >>> JVMTI_VERSION = 0x30000000 + (11 * 0x10000) + (0 *
>>>>>>> 0x100) +
>>>>>>> >>> 0 /* version: 11.0.0 */
>>>>>>> >>> };
>>>>>>> >>>
>>>>>>> >>> #define JVMTI_LATEST_VERSION (0x30000000 + (11 *
>>>>>>> 0x10000)
>>>>>>> + (0 *
>>>>>>> >>> 0x100) + 0 /* version: 11.0.0 */)
>>>>>>> >>
>>>>>>> >> I is not a problem to implement this one.
>>>>>>> >> But I'm not sure how does this really help in your case.
>>>>>>> >> I do not see a point to test the JVMTI_VERSION with
>>>>>>> #if as
>>>>>>> it is
>>>>>>> >> always defined.
>>>>>>> >> Could you, please, elaborate a little bit more?
>>>>>>> >>
>>>>>>> >> Thanks,
>>>>>>> >> Serguei
>>>>>>> >>
>>>>>>> >>> Right now, I have to do weird things where I detect the
>>>>>>> jvmti.h
>>>>>>> >>> used at compile time to then do -DUSING_JDK11 for the
>>>>>>> agent at
>>>>>>> >>> compile time.
>>>>>>> >>>
>>>>>>> >>> Thanks!
>>>>>>> >>> Jc
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>> On Thu, May 9, 2019 at 8:48 AM
>>>>>>> serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >>> <mailto:serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>> <serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >>> <mailto:serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>>> wrote:
>>>>>>> >>>
>>>>>>> >>> I'll try to get rid of VERSION_INTERIM.
>>>>>>> >>> Always using just VERSION_FEATURE.0.0 should not
>>>>>>> create problems
>>>>>>> >>> if we do not change JVMTI spec in VERSION_UPDATE.
>>>>>>> >>> I do not see why we would change the JVMTI spec
>>>>>>> in update
>>>>>>> >>> releases.
>>>>>>> >>> But if we do then using VERSION_UPDATE as
>>>>>>> microversion would
>>>>>>> >>> be good enough.
>>>>>>> >>>
>>>>>>> >>> Thanks!
>>>>>>> >>> Serguei
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>> On 5/9/19 06:13, David Holmes wrote:
>>>>>>> >>> > Hi Serguei,
>>>>>>> >>> >
>>>>>>> >>> > On 9/05/2019 7:09 pm, serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >>> <mailto:serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>> wrote:
>>>>>>> >>> >> Hi David,
>>>>>>> >>> >>
>>>>>>> >>> >> Thank you a lot for review!
>>>>>>> >>> >> There are some replies below.
>>>>>>> >>> >>
>>>>>>> >>> >>
>>>>>>> >>> >> On 5/8/19 18:42, David Holmes wrote:
>>>>>>> >>> >>> Hi Serguei,
>>>>>>> >>> >>>
>>>>>>> >>> >>> On 9/05/2019 8:57 am,
>>>>>>> serguei.spitsyn at oracle.com
>>>>>>> <mailto:serguei.spitsyn at oracle.com>
>>>>>>> >>> <mailto:serguei.spitsyn at oracle.com
>>>>>>> �� <mailto:serguei.spitsyn at oracle.com>> wrote:
>>>>>>> >>> >>>> Please, review a fix for the task:
>>>>>>> >>> >>>>
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8219023
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> Webrev:
>>>>>>> >>> >>>>
>>>>>>> >>>
>>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2019/8219023-svc-version.1/
>>>>>>>
>>>>>>> >>>
>>>>>>> >>> >>>>
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> Summary:
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> By design as we have never bumped the JVMTI
>>>>>>> version unless
>>>>>>> >>> >>>> there were spec changes for that release.
>>>>>>> Now
>>>>>>> we want
>>>>>>> >>> to sync
>>>>>>> >>> >>>> the JVMTI version with the JDK version
>>>>>>> regardless of
>>>>>>> >>> whether
>>>>>>> >>> >>>> or not spec changes have occurred in that
>>>>>>> release.
>>>>>>> >>> >>>> Also, we want it automatically set by the
>>>>>>> build system
>>>>>>> >>> so that
>>>>>>> >>> >>>> no manual updates are needed for each
>>>>>>> release.
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> The jvmti.h and jvmti.html (JVMTI spec) are
>>>>>>> generated from
>>>>>>> >>> >>>> the jvmti.xsl with the XSLT scripts now. So,
>>>>>>> the fix
>>>>>>> >>> removes
>>>>>>> >>> >>>> hard coded major, minor and micro versions
>>>>>>> from the
>>>>>>> >>> jvmti.xml
>>>>>>> >>> >>>> and passes major and minor parameters
>>>>>>> with the
>>>>>>> -PARAMETER
>>>>>>> >>> >>>> to the XSL transformation.
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> Another part of the fix is in the JDI
>>>>>>> which starts
>>>>>>> >>> using JDK
>>>>>>> >>> >>>> versions now instead of maintaining its own,
>>>>>>> and in
>>>>>>> >>> the JDWP
>>>>>>> >>> >>>> agent which is using the JVMTI versions
>>>>>>> instead of its
>>>>>>> >>> own.
>>>>>>> >>> >>>
>>>>>>> >>> >>> This all seems reasonable (though I'm no
>>>>>>> expert on
>>>>>>> >>> working with XSL
>>>>>>> >>> >>> etc).
>>>>>>> >>> >>>
>>>>>>> >>> >>> One thing I am unclear of is why you bother
>>>>>>> with
>>>>>>> using
>>>>>>> >>> >>> VERSION_INTERIM when the actual version check
>>>>>>> will only
>>>>>>> >>> consider
>>>>>>> >>> >>> VERSION_FEATURE (aka major). Couldn't you just
>>>>>>> leave the
>>>>>>> >>> "minor"
>>>>>>> >>> >>> part 0 the same as the "micro" part?
>>>>>>> >>> >>
>>>>>>> >>> >> This is right question to ask.
>>>>>>> >>> >> I was two-folded on this.
>>>>>>> >>> >> But finally decided to maintain minor version
>>>>>>> (aka
>>>>>>> >>> VERSION_INTERIM).
>>>>>>> >>> >> Then the JVMTI and debugger version will
>>>>>>> match the
>>>>>>> VM and
>>>>>>> >>> JDK version
>>>>>>> >>> >> for update releases.
>>>>>>> >>> >> If understand it correctly, we are still
>>>>>>> going to have
>>>>>>> >>> major.minor
>>>>>>> >>> >> versions.
>>>>>>> >>> >
>>>>>>> >>> > Not really. What we have now are things like
>>>>>>> 11.0.3 and
>>>>>>> >>> 12.0.1 - only
>>>>>>> >>> > using the first and third parts. The full 4 part
>>>>>>> version
>>>>>>> >>> string is:
>>>>>>> >>> >
>>>>>>> >>> >
>>>>>>> >>>
>>>>>>> $VERSION_FEATURE.$VERSION_INTERIM.$VERSION_UPDATE.$VERSION_PATCH
>>>>>>> >>> >
>>>>>>> >>> > and we typically only update version_feature and
>>>>>>> >>> version_update.
>>>>>>> >>> >
>>>>>>> >>> > https://openjdk.java.net/jeps/322
>>>>>>> >>> >
>>>>>>> >>> >> Also, the JVMTI GetVersionNumberspec still
>>>>>>> tells about
>>>>>>> >>> both minor and
>>>>>>> >>> >> micro versions.
>>>>>>> >>> >> It also defines special constants for
>>>>>>> corresponding masks
>>>>>>> >>> and shifts:
>>>>>>> >>> >>
>>>>>>> >>> >> Version Masks
>>>>>>> >>> >> Constant Value Description
>>>>>>> >>> >> |JVMTI_VERSION_MASK_INTERFACE_TYPE| 0x70000000
>>>>>>> >>> Mask to
>>>>>>> >>> >> extract
>>>>>>> >>> >> interface type. The value of the version
>>>>>>> returned by
>>>>>>> >>> this function
>>>>>>> >>> >> masked with
>>>>>>> |JVMTI_VERSION_MASK_INTERFACE_TYPE| is always
>>>>>>> >>> >> |JVMTI_VERSION_INTERFACE_JVMTI| since this is
>>>>>>> a JVMTI
>>>>>>> >>> function.
>>>>>>> >>> >> |JVMTI_VERSION_MASK_MAJOR| 0x0FFF0000
>>>>>>> Mask to
>>>>>>> >>> extract major
>>>>>>> >>> >> version number.
>>>>>>> >>> >> |JVMTI_VERSION_MASK_MINOR| 0x0000FF00
>>>>>>> Mask to
>>>>>>> >>> extract minor
>>>>>>> >>> >> version number.
>>>>>>> >>> >> |JVMTI_VERSION_MASK_MICRO| 0x000000FF
>>>>>>> Mask to
>>>>>>> >>> extract micro
>>>>>>> >>> >> version number.
>>>>>>> >>> >>
>>>>>>> >>> >> Version Shifts
>>>>>>> >>> >> Constant Value Description
>>>>>>> >>> >> |JVMTI_VERSION_SHIFT_MAJOR| 16 Shift to
>>>>>>> extract major
>>>>>>> >>> >> version number.
>>>>>>> >>> >> |JVMTI_VERSION_SHIFT_MINOR| 8 Shift to
>>>>>>> extract
>>>>>>> minor
>>>>>>> >>> >> version number.
>>>>>>> >>> >> |JVMTI_VERSION_SHIFT_MICRO| 0 Shift to
>>>>>>> extract
>>>>>>> micro
>>>>>>> >>> >> version number.
>>>>>>> >>> >>
>>>>>>> >>> >>
>>>>>>> >>> >> This is link to the spec:
>>>>>>> >>> >>
>>>>>>> >>>
>>>>>>> https://docs.oracle.com/en/java/javase/11/docs/specs/jvmti.html#GetVersionNumber
>>>>>>>
>>>>>>> >>>
>>>>>>> >>> >>
>>>>>>> >>> >>
>>>>>>> >>> >> It seems, changing (and/or deprecating) this
>>>>>>> will give
>>>>>>> >>> more problems
>>>>>>> >>> >> than benefits.
>>>>>>> >>> >> It is better to remain compatible with previous
>>>>>>> releases.
>>>>>>> >>> >
>>>>>>> >>> > This is a problem that was flagged when the new
>>>>>>> versioning
>>>>>>> >>> scheme was
>>>>>>> >>> > introduced but I'm guessing nothing was actually
>>>>>>> done about
>>>>>>> >>> it. They
>>>>>>> >>> > are not really compatible beyond the
>>>>>>> major/feature
>>>>>>> part.
>>>>>>> >>> >
>>>>>>> >>> > If we only update the spec version with the
>>>>>>> feature
>>>>>>> version
>>>>>>> >>> then all
>>>>>>> >>> > versions will have the form N.0.0. However
>>>>>>> your changes
>>>>>>> >>> will also
>>>>>>> >>> > update if we happen to use a VERSION_INTERIM
>>>>>>> for some
>>>>>>> >>> reason - though
>>>>>>> >>> > the version check will ignore that anyway. I'm
>>>>>>> not
>>>>>>> really
>>>>>>> >>> seeing the
>>>>>>> >>> > point in having that happen.
>>>>>>> >>> >
>>>>>>> >>> > Maybe we do need to define a new version API that
>>>>>>> maps to
>>>>>>> >>> the new
>>>>>>> >>> > versioning scheme of OpenJDK ? But if we did
>>>>>>> that we'd
>>>>>>> >>> still have to
>>>>>>> >>> > support the legacy mapping and I'd still advocate
>>>>>>> simply using
>>>>>>> >>> > VERSION_FEATURE.0.0.
>>>>>>> >>> >
>>>>>>> >>> > It's tricky.
>>>>>>> >>> >
>>>>>>> >>> > David
>>>>>>> >>> > -----
>>>>>>> >>> >
>>>>>>> >>> >>> For the record I considered whether this
>>>>>>> needs a CSR
>>>>>>> >>> request and
>>>>>>> >>> >>> concluded it did not as it doesn't involve
>>>>>>> changing any
>>>>>>> >>> actual
>>>>>>> >>> >>> specifications.
>>>>>>> >>> >>
>>>>>>> >>> >> Okay, thanks.
>>>>>>> >>> >> I considered it too, made the same conclusion
>>>>>>> but
>>>>>>> still
>>>>>>> >>> have some
>>>>>>> >>> >> doubt. :)
>>>>>>> >>> >>
>>>>>>> >>> >> Thanks!
>>>>>>> >>> >> Serguei
>>>>>>> >>> >>
>>>>>>> >>> >>>
>>>>>>> >>> >>> Thanks,
>>>>>>> >>> >>> David
>>>>>>> >>> >>>
>>>>>>> >>> >>>> Testing:
>>>>>>> >>> >>>> Generated docs and jvmti.h and checked the
>>>>>>> versions
>>>>>>> >>> are correct.
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> One could ask if we have to use same or
>>>>>>> similar
>>>>>>> approach for
>>>>>>> >>> >>>> other API's and tools, like JNI, JMX and so
>>>>>>> on.
>>>>>>> >>> >>>> But these are not areas of my expertise or
>>>>>>> responsibility.
>>>>>>> >>> >>>> It just feels like there is some room for
>>>>>>> unification here.
>>>>>>> >>> >>>>
>>>>>>> >>> >>>> Thanks,
>>>>>>> >>> >>>> Serguei
>>>>>>> >>> >>
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>> --
>>>>>>> >>>
>>>>>>> >>> Thanks,
>>>>>>> >>> Jc
>>>>>>> >>
>>>>>>> >>
>>>>>>> >>
>>>>>>> >> --
>>>>>>> >>
>>>>>>> >> Thanks,
>>>>>>> >> Jc
>>>>>>> >
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Jc
>>>>>>
>>>>>
>>>
>>
More information about the serviceability-dev
mailing list