RFR(M) 8252526 Remove excessive inclusion of jvmti.h and jvmtiExport.hpp
Ioi Lam
ioi.lam at oracle.com
Tue Sep 1 04:00:13 UTC 2020
On 8/31/20 6:17 PM, Ioi Lam wrote:
>
>
> On 8/31/20 4:05 PM, David Holmes wrote:
>> Hi Ioi,
>>
>> I haven't looked at the code changes ...
>>
>> On 1/09/2020 4:13 am, Ioi Lam wrote:
>>> https://bugs.openjdk.java.net/browse/JDK-8252526
>>> http://cr.openjdk.java.net/~iklam/jdk16/8252526-fix-jvmti-hpp.v01/
>>>
>>> (I marked this RFR as "M" because 63 files have changed, but most of
>>> the are
>>> just adding a missing #include "prims/jvmtiExport.hpp").
>>>
>>> jvmti.h is included 905 times and jvmtiExport.hpp is included 776 times
>>> (by 971 hotspot .o files). Most of these are unnecessarily included
>>> by the
>>> following 3 popular header files:
>>>
>>> [1] javaClasses.hpp: ThreadStatus is rarely used, and should be moved
>>> to javaThreadStatus.hpp. I also converted the enum to an C++ 11
>>> enum class for better type safety. (see also JDK-8247938).
>>>
>>> [2] os.hpp: No need to include jvm.h. Use forward declaration
>>> "typedef struct _jvmtiTimerInfo jvmtiTimerInfo;" instead.
>>
>> That does not seem reasonable to me. It is one thing to do a simple
>> forward declaration of a class but this is an internal detail of
>> JVMTI which os.hpp has no business knowing about.
>>
>
> How about changing jvmti.h from:
>
> struct _jvmtiTimerInfo;
> typedef struct _jvmtiTimerInfo jvmtiTimerInfo;
>
> to
>
> struct jvmtiTimerInfo;
> typedef struct jvmtiTimerInfo jvmtiTimerInfo;
>
> Then os.hpp can declare:
>
> struct jvmtiTimerInfo;
>
> I wonder why we use the _ prefix. It seems like an anachronism to me.
> Do we still support C compilers that cannot handle "typedef struct Foo
> Foo;"
>
In fact I think this typedef is not an implementation detail. It's not
intended to hide anything in jvmti.h. I.e., it's not a typedef of an
opaque structure. All fields in the structure can be accessed without
any access control.
It's just an odd style of declaring a structure that tries to be
compatible with ancient C compilers, so you can use "jvmtiTimerInfo"
instead of "struct jvmtiTimerInfo" everywhere. It could have been
written like this (from our official spec):
https://docs.oracle.com/en/java/javase/14/docs/specs/jvmti.html
typedef struct {
jlong max_value;
jboolean may_skip_forward;
jboolean may_skip_backward;
jvmtiTimerKind kind;
jlong reserved1;
jlong reserved2;
} jvmtiTimerInfo;
Why don't we use this style in jvmti.h? Well, one difference is that
this style cannot be forward declared without revealing the contents of
the struct!
I would argue that the reason for the current style is for the *very
purpose* so that it can be forward declared :-)
Thanks
- Ioi
>>> [3] thread.hpp: No need to include jvmExport.hpp. Use forward
>>> declaration
>>> for JvmtiSampledObjectAllocEventCollector and
>>> JvmtiVMObjectAllocEventCollector instead.
>>>
>>>
>>> The total number of includes have reduced from 252033 to 250001.
>>> Build time of
>>> slow-debug libjvm.so is reduced from 2:07 to 2:04 on my machine.
>>
>> I'm not sure why we really care. The build times are not that
>> problematic that it warrants some of these header file hacks IMO.
>
> My main goal is to speed up incremental builds. Currently we have more
> than 200 header files that are included by more than half of the .o
> files of hotspot. I would often get massive rebuilds after touching a
> header file. Removing the unnecessary dependencies will help developer
> productivity.
>
> Also, currently we do a lot of build validations in tier5 and we had
> consistently missed build problems with the minimal build. I suggested
> to move those builds to tier1, but that was turned down because the
> builds are not fast enough.
>
>> Are those figures with or without PCH?
>>
> I tested on Linux without PCH.
>
> Thanks
> - Ioi
>
>> David
>> -----
>>
>>>
>>> Thanks
>>> - Ioi
>>>
>
More information about the hotspot-runtime-dev
mailing list