RFR (S): 8219023: Investigate syncing JVMTI spec version with JDK version

Jean Christophe Beyler jcbeyler at google.com
Tue May 14 15:13:10 UTC 2019


Hi Serguei,

For what it's worth, I created
https://bugs.openjdk.java.net/browse/JDK-8223881 so that we can hopefully
work on it once this and 13 goes through :)
Jc

*From: *serguei.spitsyn at oracle.com <serguei.spitsyn at oracle.com>
*Date: *Tue, May 14, 2019 at 3:12 AM
*To: *David Holmes, Jean Christophe Beyler
*Cc: *serviceability-dev

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
> >>>>>>
> >>>>>
> >>>
> >>
>
>

-- 

Thanks,
Jc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20190514/3843bace/attachment-0001.html>


More information about the serviceability-dev mailing list