RFR (XS) 8143615 compactHashtable.hpp includes oop.inline.hpp file

Ioi Lam ioi.lam at oracle.com
Fri Dec 4 22:59:41 UTC 2015


Hi Stefan,

Thanks for the explanation. I have updated the webrev

http://cr.openjdk.java.net/~iklam/8143615-compactHashtable-inline-hpp.v2/

updates from the last version:

[1] Move the two add functions identified by Stefan to 
compactHashtable.inline.hpp
[2] Removed allocation.inline.hpp from compactHashtable.hpp
[3] Removed oop.inline.hpp from compilerDirectives.hpp

Thanks
- Ioi

On 12/4/15 1:23 AM, Stefan Karlsson wrote:
> On 2015-12-03 15:44, Ioi Lam wrote:
>> On 12/3/15 1:09 AM, Stefan Karlsson wrote:
>>> Hi Ioi,
>>>
>>> Thanks a lot for fixing this!
>>>
>>> Would you mind swapping these lines around?:
>>>
>>>  #include "classfile/javaClasses.hpp"
>>> +#include "classfile/compactHashtable.inline.hpp"
>>
>> Thanks for noticing. I will fix that.
>>> Except for that nit, this looks good.
>>>
>>> As David says, we should get rid of the allocation.inline.hpp 
>>> include as well, but I think we could defer that to a separate patch 
>>> (if you want to).
>>
>> TL;DR  -- this fix probably won't do much in terms of speeding up a 
>> rebuild, but
>> may still be a good clean up ...
>
> My main concern is not about the compile times, but that we're 
> spreading the include mess.
>
>>
>>
>> Read the following if you're bored ----v
>>
>> Actually, I am not quite familiar with the rules of when/if 
>> *.inline.hpp can
>> be inlcluded by a "regular" hpp file.Is that documented somewhere?
>
> https://wiki.openjdk.java.net/display/HotSpot/StyleGuide#Files
>
>>
>> My guess is this happened when Stefan reported the bug:
>>
>> + precompiled header is used
>
> I compile without precompiled headers.
>
>>
>> + oop.inline.hpp was (indirectly) included into precompiled.hpp.gch.d
>>    - this was actually not caused by compactHashtable.hpp(this file 
>> is not
>>      included by precompiled.hpp)
>>      You can verified this from auto-generated files such as
>> hotspot/linux_amd64_compiler2/generated/dependencies/precompiled.hpp.gch.d 
>>
>>    - the culprit is src/share/vm/compiler/compilerDirectives.hpp, 
>> which also
>>      includes oop.inline.hpp,introduced in this changeset:
>>          changeset:   9323:a176d4737606
>>          user:        neliasso
>>          8137167:     JEP165: Compiler Control: Implementation task
>>          Summary:     Compiler Control JEP
>>    - the depedndency is precompiled.hpp -> ciEnv.hpp -> 
>> compilerDirectives.hpp-> oop.inline.hpp
>
> :(
>
>>
>> + oop.inline.hpp itself includes many GC header files, so when Stefan 
>> touches one of them,
>>   everything is recompiled.
>
> Yes.
>
>>
>> So my interpretation is:
>>
>> + We should try to minimize the number of other header files included 
>> in "regular" .hpp files
>>   - Complex inline functions should be defined in .inline.hpp files.
>
> Yes.
>
>> + Avoid including .inline.hpp files in "regular" .hpp files, since 
>> that may indirectly
>>   include a large set of header files.
>
> Yes.
>
>>
>> Anyway, I don't think this can be easily adhered to, or easily 
>> understood, or cared
>> about, by the developers.
>
> It's quite simple if you by default _don't_ put definitions in the 
> header file. Put all implementation in the .cpp files, and if it's 
> important to inline the functions, put the code in an .inline.hpp 
> files. It's when code is put into .hpp that things start to become 
> problematic.
>
> Granted, _simple_ getters and setters in header files don't pose a 
> problem.
>
>> Moreover, there are actually a lot of various inline.hpp files
>> being included in .hpp files.
>>
>> hotspot/src/share$ find . -name \*inline.hpp -prune -o -name \*.hpp 
>> -print | xargs grep inline.hpp | grep -v precompiled.hpp | wc
>>      60     189    4387
>
> $ find . -name \*inline.hpp -prune -o -name \*.hpp -print | xargs grep 
> inline.hpp | grep -v precompiled.hpp | grep "#include" |  awk -F: '{ 
> print $2}' | sort | uniq -c
>       5 #include "asm/macroAssembler.inline.hpp"
>       1 #include "assembler_zero.inline.hpp"
>       1 #include "bytes_linux_ppc.inline.hpp"
>      17 #include "memory/allocation.inline.hpp"
>       2 #include "memory/universe.inline.hpp"
>       2 #include "oops/oop.inline.hpp"
>       1   #include "os_windows.inline.hpp"  // needed for sockaddr_in
>       1 #include "prims/jvmtiThreadState.inline.hpp"
>       6 #include "runtime/frame.inline.hpp"
>       6 #include "runtime/handles.inline.hpp"
>       1 #include "runtime/objectMonitor.inline.hpp"
>       2 #include "runtime/orderAccess.inline.hpp"
>       8 #include "runtime/thread.inline.hpp"
>       2 #include "utilities/bitMap.inline.hpp"
>       1 #include "utilities/hashtable.inline.hpp"
>
>
> There used to be loads more includes of oop.inline.hpp, but I removed 
> them.
>
>>
>> So I think in an ideal world, we should have a tool that can 
>> automatically
>> flags the "bad" includes. But, I am not sure how much time we want to 
>> invest in that :-(
>>
>> In this particular case, after I removed oop.inline.hpp from 
>> compilerDirectives.hpp
>> (it turned out to be an unnecessary include), only 7 include files 
>> were removed from
>> precompiled.hpp.gch.d, so I am not sure it's a big win.
>>
>> But in terms of clean up, it's still a good idea to move big inline 
>> function
>> definitions out of compactHashtable.hpp.
>
> Not that the size shouldn't be measured in number of lines, but what 
> they depend on:
>
>  120   void add(unsigned int hash, Symbol* symbol) {
>  121     add(hash, new Entry(hash, symbol));
>  122   }
>  123
>  124   void add(unsigned int hash, oop string) {
>  125     add(hash, new Entry(hash, string));
>  126   }
>
>
> Take these lines, for example, they force the include of 
> allocation.inline.hpp in compactHashtable.cpp. Simply moving these 
> definitions to the .cpp removes the need to include 
> allocation.inline.hpp.
>
>>
>>
>> Also, I can see that allocation.inline.hpp is included by many .hpp 
>> files, so
>> I guess it's OK for compactHashtable.hpp to do the same. If a clean 
>> up is needed,
>> that would need to be done in a separate RFE.
>>
>> hotspot/src/share$ find . -name \*inline.hpp -prune -o -name \*.hpp 
>> -print | xargs grep allocation.inline.hpp
>> ./vm/precompiled/precompiled.hpp:# include 
>> "memory/allocation.inline.hpp"
>> ./vm/prims/jvmtiEventController.hpp:#include 
>> "memory/allocation.inline.hpp"
>> ./vm/prims/jvmtiEnvThreadState.hpp:#include 
>> "memory/allocation.inline.hpp"
>> ./vm/prims/jvmtiThreadState.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/oops/generateOopMap.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/compiler/compileTask.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/compiler/methodMatcher.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/classfile/compactHashtable.hpp:#include 
>> "memory/allocation.inline.hpp"
>> ./vm/classfile/symbolTable.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/classfile/stringTable.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/utilities/growableArray.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/utilities/stack.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/utilities/array.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/gc/g1/g1Predictions.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/runtime/perfData.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/logging/log.hpp:#include "memory/allocation.inline.hpp"
>> ./vm/libadt/dict.hpp:#include "memory/allocation.inline.hpp"
>
> It would be good to decrease that list, not add to it. Maybe 
> allocation.inline.hpp needs to fixed, and parts moved to the .cpp file.
>
> I see that g1Predictions.hpp added allocation.inline.hpp. I recently 
> went over the entire GC code base and got rid of _all_ includes of 
> .inline.hpp files from .hpp files.
>
> Stefank
>
>>
>>
>> Thanks
>> - Ioi
>>
>>
>>
>>> Thanks,
>>> StefanK
>>>
>>> On 2015-12-03 03:32, Ioi Lam wrote:
>>>> Please review a very small fix:
>>>>
>>>> http://cr.openjdk.java.net/~iklam/8143615-compactHashtable-inline-hpp/
>>>>
>>>> Bug: compactHashtable.hpp includes oop.inline.hpp file
>>>>
>>>>     https://bugs.openjdk.java.net/browse/JDK-8143615
>>>>
>>>> Summary of fix:
>>>>
>>>>     + deleted the include of oop.inline.hpp from compactHashtable.hpp
>>>>     + moved all inlined functions that require oop.inline.hpp into a
>>>>       new file, compactHashtable.inline.hpp
>>>>
>>>> Tests:
>>>>
>>>>     JPRT
>>>>
>>>> Thanks
>>>> - Ioi
>>>
>>
>



More information about the hotspot-dev mailing list