RFR: 8141564: Convert TraceItables and PrintVtables to Unified Logging

Rachel Protacio rachel.protacio at oracle.com
Thu Jan 7 17:12:25 UTC 2016


Great, thanks, Coleen!
Rachel

On 1/6/2016 5:14 PM, Coleen Phillimore wrote:
>
> I remember this change!  This came out very nice.  I agree that 
> @ignore'ing the test until we figure out what's wrong with these tests 
> on Windows is a good thing to do.
>
> Thanks,
> Coleen
>
> On 1/6/16 4:31 PM, Rachel Protacio wrote:
>> Hi,
>>
>> When I tried to commit this change, the ItablesTest was failing on 
>> windows, so I've been trying to get to the bottom of that failure. As 
>> other logging tests have recently proved themselves flaky on windows 
>> as well, it seems to be a deeper issue. As such, I have added the 
>> problem to https://bugs.openjdk.java.net/browse/JDK-8146435 for more 
>> thorough investigation and ignored the ItablesTest for the time being.
>>
>> Here's my new webrev 
>> http://cr.openjdk.java.net/~rprotacio/8141564.03/ which only differs 
>> from the previously approved code via the @ignore line. The code 
>> passes JPRT.
>>
>> Thank you!
>> Rachel
>>
>> On 12/8/2015 12:28 PM, Karen Kinnear wrote:
>>> Rachel,
>>>
>>> Thank you for the updates.
>>> Can you please sanity check one thing for me - the log_tables 
>>> boolean “overrides” appears to
>>> be set correctly in the callers, to mean “yes, this overrides”.
>>> In log_vtables, is it possible the choice of what to print is reversed?
>>>
>>> And perhaps add a check to your tests for example that “NOT 
>>> overriding” catches the right case?
>>>
>>> And yes please on the assertion (I have seen null method bugs in 
>>> development and this code is an early
>>> opportunity to catch that problem).
>>>
>>> I don’t need to see an updated web rev and you don’t need to rerun 
>>> all the tests to fix
>>> the printed string.
>>>
>>> thanks,
>>> Karen
>>>
>>>> On Dec 7, 2015, at 1:37 PM, Coleen Phillimore 
>>>> <coleen.phillimore at oracle.com> wrote:
>>>>
>>>>
>>>>
>>>> On 12/4/15 6:00 PM, Rachel Protacio wrote:
>>>>> Hi, Karen,
>>>>>
>>>>> Thanks for the review. Updated webrev: 
>>>>> http://cr.openjdk.java.net/~rprotacio/8141564.02/
>>>>>
>>>>> Since I never listed the tests I ran even the first time, here are 
>>>>> all of them:
>>>>>
>>>>> * jtreg
>>>>> * JPRT
>>>>> * jck vm, lang, & api/java_lang
>>>>> * rbt quick and non-colo (which now includes defmeth)
>>>>> * invoke*
>>>>>
>>>>> Replies inline.
>>>>>
>>>>> On 12/3/2015 4:56 PM, Karen Kinnear wrote:
>>>>>> Rachel,
>>>>>>
>>>>>> Thank you so much for doing (and redoing) this.
>>>>>>
>>>>>> Couple of questions/comments.
>>>>>>
>>>>>> 1. thank you so much for the transitive overriding test - not 
>>>>>> easy to figure out how to generate one!
>>>>>>
>>>>> Lois walked me through doing that one :)
>>>>>> 2. I missed the list of what you have tested for the first web 
>>>>>> rev and the other tests for this one
>>>>>> I will assume in parallel with the code review you are running 
>>>>>> (without tracing)
>>>>>> vm quick & nocolo, jck vm & lang
>>>>>> defmeth, invoke*
>>>>> Yeah, I totally forgot to email what tests I had run. Sorry about 
>>>>> that! And just learned how to run the jck tests.
>>>>>> There might be value in running your new tests with old tracing 
>>>>>> vs. new and eyeballing the files - to see if they
>>>>>> get essentially the same information.
>>>>>>
>>>>> Yup!
>>>>>> 3. klassVtable.cpp lines 154-156 …
>>>>>> Would it make any sense to do if !klass()->is_array_klass() and 
>>>>>> then just use the log_develop_debug and
>>>>>> not do the extra develop_log_is_enabled check? No big deal.
>>>>>>
>>>>> That makes sense. Changed as suggested.
>>>>>> 4. thank you so much for extracting the print_linkage_flags - I 
>>>>>> should have done that earlier - the information
>>>>>> just grew incrementally.
>>>>>>
>>>>>> 5. klassVtable.cpp line 1047 -
>>>>>>    I think you want an if (m != NULL) here  before dereferencing 
>>>>>> to print_linkage_flags.
>>>>>>    I see we miss that check for other dereferences -feel free to 
>>>>>> add small checks.
>>>>>>    Don’t completely skip logic paragraphs except for printing ones.
>>>>> Well, when I was making my change, we saw that it wouldn't be 
>>>>> possible for m to be null at that point in the code. There are 
>>>>> multiple places above it where it is dereferenced already, not to 
>>>>> mention the fact that it is theoretically initialized to be a 
>>>>> valid method. Would you like to me to add an assert after the 
>>>>> declaration
>>>>>     assert(m != NULL, "methods can never be null");
>>>>> just to be safe?
>>>> In the code here:
>>>> http://cr.openjdk.java.net/~rprotacio/8141564.02/src/share/vm/oops/klassVtable.cpp.udiff.html 
>>>> <http://cr.openjdk.java.net/~rprotacio/8141564.02/src/share/vm/oops/klassVtable.cpp.udiff.html> 
>>>>
>>>>
>>>> Yes, Method* m = method->at(i); can never return NULL or else the 
>>>> whole VM would crash everywhere.  I suspect the logging code here 
>>>> was copied from other instances where 'm' could be null.   This 
>>>> line would crash first:
>>>>
>>>> if (interface_method_needs_itable_index(m)) {
>>>>
>>>>
>>>> Can you clean up this line also to not check for NULL:
>>>>
>>>> const char* sig = (m != NULL) ? m->name_and_sig_as_C_string() : 
>>>> "<NULL>";
>>>>
>>>>
>>>> And add the assert if Karen agrees if it's needed.
>>>>
>>>> The rest of the changes look good.   I don't need to see another 
>>>> revision.
>>>>
>>>> Thanks,
>>>> Coleen
>>>>>>     Thank you for leaving the null check in fill_in_miranda and 
>>>>>> print_method_at.
>>>>>>
>>>>>> 6. log_vtables
>>>>>> The logic in update_inherited_vtables is quite complex.
>>>>>> So the value of allocate_new is not really the right conditional 
>>>>>> to pass in to determine if there
>>>>>> was an override.
>>>>>>    The first paragraph applies both for allocate_new=true and 
>>>>>> allocate_new=false (see !target_method()->is_package_private())
>>>>>>    so they would have allocate_new = true AND be overriding.
>>>>>>
>>>>>> So, perhaps you could add a boolean that says “overrides” or 
>>>>>> “overriding” or whatever : default it to false, and set it to 
>>>>>> true right after the put_method_at line (that iswhere the 
>>>>>> override occurs) and set it to false in the “else” clause?
>>>>>> And pass that argument in to log_vtables ? And remove the 
>>>>>> allocate_new comment from log_vtables as well?
>>>>>>
>>>>> Done, too.
>>>>>
>>>>> Thanks!!
>>>>> Rachel
>>>>>> And the comment in the “else” is not accurate since I put the 
>>>>>> package_private fix in - so removing
>>>>>> it was a good idea.
>>>>>>
>>>>>> many thanks,
>>>>>> Karen
>>>>>>
>>>>>>> On Dec 3, 2015, at 2:23 PM, Rachel Protacio 
>>>>>>> <rachel.protacio at oracle.com <mailto:rachel.protacio at oracle.com> 
>>>>>>> <mailto:rachel.protacio at oracle.com 
>>>>>>> <mailto:rachel.protacio at oracle.com>>> wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>> Thanks for the comments! Updated 
>>>>>>> webrev:http://cr.openjdk.java.net/~rprotacio/8141564.01/ 
>>>>>>> <http://cr.openjdk.java.net/~rprotacio/8141564.01/><http://cr.openjdk.java.net/%7Erprotacio/8141564.01/ 
>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564.01/>>(Builds 
>>>>>>> and passes logging jtreg tests.)
>>>>>>>
>>>>>>> Replies inline.
>>>>>>>
>>>>>>> On 12/2/2015 2:34 PM, Coleen Phillimore wrote:
>>>>>>>> Rachel, There are a lot of changes here.  I have several 
>>>>>>>> comments and more suggested cleanup that should be done with 
>>>>>>>> this work.
>>>>>>>>
>>>>>>>> Inhttp://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/interpreter/linkResolver.cpp.udiff.html 
>>>>>>>> <inhttp://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/interpreter/linkResolver.cpp.udiff.html><http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/interpreter/linkResolver.cpp.udiff.html 
>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/interpreter/linkResolver.cpp.udiff.html>> 
>>>>>>>>
>>>>>>>>
>>>>>>>> I did the original refactoring for trace_method_resolution. 
>>>>>>>> What I think would be better is to make it an internal static 
>>>>>>>> function in linkResolver.cpp and not defined in the 
>>>>>>>> linkResolver.hpp.  Make the call unconditional and pass vtable 
>>>>>>>> index in the last parameter as a default parameter with default 
>>>>>>>> value -1 so the last line in the function is the tty->cr() that 
>>>>>>>> I had outside the function call (that was pretty icky). And put 
>>>>>>>> all the ResourceMark and logstream logic inside the 
>>>>>>>> trace_method_resolution function.  It would never print to tty 
>>>>>>>> so doesn't need an outputStream parameter for other callers.
>>>>>>>>
>>>>>>>> So there would be only the one line 
>>>>>>>> trace_method_resolution(params) in the regular code.
>>>>>>> Thanks for the advice! I still have to call the function from 
>>>>>>> within the conditional because it's develop level only and 
>>>>>>> because I need to specify in the call whether it's for itables 
>>>>>>> or vtables. Otherwise, I've followed your suggestions.
>>>>>>>> http://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/logging/logTag.hpp.udiff.html 
>>>>>>>> <http://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/logging/logTag.hpp.udiff.html><http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/logging/logTag.hpp.udiff.html 
>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/logging/logTag.hpp.udiff.html>> 
>>>>>>>>
>>>>>>>>
>>>>>>>> Can you put these tags near each other?
>>>>>>>>
>>>>>>> I have them sorted alphabetically, which I think is more useful 
>>>>>>> in the long run.
>>>>>>>> http://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/oops/klassVtable.cpp.udiff.html 
>>>>>>>> <http://cr.openjdk.java.net/~rprotacio/8141564/src/share/vm/oops/klassVtable.cpp.udiff.html><http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/oops/klassVtable.cpp.udiff.html 
>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/src/share/vm/oops/klassVtable.cpp.udiff.html>> 
>>>>>>>>
>>>>>>>>
>>>>>>>> One of the things that Markus Gronlund's made me think that we 
>>>>>>>> should do with his cleanup is to stop declaring functions as 
>>>>>>>> members of classes if they don't need external linkage. From 
>>>>>>>> his RFR(L): 8140485: Class load and creation clean up:
>>>>>>>>
>>>>>>>> "Comment: In my opinion, we should attempt to break the pattern 
>>>>>>>> of having private functions declared in header files when the 
>>>>>>>> private function does not need to reach inside "this"."
>>>>>>>>
>>>>>>>> I think the function log_vtables should follow this and be 
>>>>>>>> declared as a static internal function in klassVtable.cpp above 
>>>>>>>> the function where it's used.
>>>>>>>>
>>>>>>>> It's true that you don't see this very much in the hotspot 
>>>>>>>> sources.
>>>>>>>>
>>>>>>>> The refactoring of log_vtables is good and very much appreciated.
>>>>>>>>
>>>>>>>> In each of the logging blocks of code, there are about 6 lines 
>>>>>>>> that are about the same, that print the access flags and 
>>>>>>>> whether it's a default or overpass method. (Karen and Lois 
>>>>>>>> should give you a TOI about what that means!)  Can you add a 
>>>>>>>> method to method.hpp that's something like 
>>>>>>>> print_flags(outputStream* st) and move this printing there, and 
>>>>>>>> make those blocks call your new function?  That would shorten 
>>>>>>>> many of these logging blocks of code and would be nice.  You 
>>>>>>>> could call this from the linkResolver.cpp 
>>>>>>>> trace_method_resolution() function too.
>>>>>>> Done.
>>>>>>>> http://cr.openjdk.java.net/~rprotacio/8141564/test/runtime/logging/p1/A.java.html 
>>>>>>>> <http://cr.openjdk.java.net/~rprotacio/8141564/test/runtime/logging/p1/A.java.html><http://cr.openjdk.java.net/%7Erprotacio/8141564/test/runtime/logging/p1/A.java.html 
>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/test/runtime/logging/p1/A.java.html>> 
>>>>>>>>
>>>>>>>>
>>>>>>>> These classes have missing copyrights.
>>>>>>> Fixed.
>>>>>>> Thanks!
>>>>>>> Rachel
>>>>>>>> Thanks!
>>>>>>>> Coleen
>>>>>>>>
>>>>>>>>
>>>>>>>> On 12/1/15 5:58 PM, Rachel Protacio wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> Please review this changeset that converts -XX:+TraceItables 
>>>>>>>>> and -XX:+PrintVtables flags to -Xlog:itables and -Xlog:vtables.
>>>>>>>>>
>>>>>>>>> Open webrev: http://cr.openjdk.java.net/~rprotacio/8141564/ 
>>>>>>>>> <http://cr.openjdk.java.net/~rprotacio/8141564/> 
>>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/ 
>>>>>>>>> <http://cr.openjdk.java.net/%7Erprotacio/8141564/>>
>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8141564 
>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8141564>
>>>>>>>>>
>>>>>>>>> In case it's not clear, the changes in oops/klassVtable.cpp 
>>>>>>>>> around 462-498 are a refactoring of the duplicate code from a 
>>>>>>>>> conditional to a function with a boolean argument.
>>>>>>>>>
>>>>>>>>> Thank you,
>>>>>>>>> Rachel
>>
>



More information about the hotspot-runtime-dev mailing list