RFR: 8141564: Convert TraceItables and PrintVtables to Unified Logging
Rachel Protacio
rachel.protacio at oracle.com
Fri Dec 4 23:00:23 UTC 2015
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?
> 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>> wrote:
>>
>> Hi,
>> Thanks for the comments! Updated
>> webrev:http://cr.openjdk.java.net/~rprotacio/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
>>> <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/%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/%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/%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/%7Erprotacio/8141564/>
>>>> Bug: 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