How to compare thecaller thread object and callee's holder?
Tom Rodriguez
tom.rodriguez at oracle.com
Thu Apr 22 19:13:01 PDT 2010
On Apr 22, 2010, at 6:27 PM, David Holmes wrote:
> Tony Guan said the following on 04/23/10 08:50:
>> Thanks you for the reply. By "holder" of a method, I mean the object
>> whose class owns the method interested.
Normally hotspot uses the term holder for the class that owns a method and receiver as the object being invoked.
>
> Ok. I didn't understand how the "thread" was related to the holder.
>
>> Given that from the dtrace functionality, I already know the current
>> thread, and the methodOoopDesc* of the called method, I need to
>> identify the caller object and the callee object from the two
>> parameters passed to the dtrace_method_entry:
>> JRT_LEAF(int, SharedRuntime::dtrace_method_entry( JavaThread* thread,
>> methodOopDesc* method)) in shareRuntime.cpp
>
> Ah that's a much more specific question :) But I'm afraid I can't answer it with certainty (I don't think you can get either easily) but the compiler folk (cc'ed) will have a much better idea.
You can't recover the caller from just those two values. If you tracked method enter/exit on a per thread stack you could track it yourself. You might also be able to use the jstack action to grab the current stack trace.
tom
>
> David
> -----
>
>
>> for a callee method, we may refer it as receiver.
>> and for a caller, let's just name it as a caller object, sorry for the
>> vague term I borrowed from the source code of hotspot. The following
>> code shows more accurately what I want:
>> class B{
>> methodB(){
>> ...
>> }
>> }
>> class A{
>> void methodA()
>> {
>> B objectB=new B();
>> objectB.methodB(); //*****here is what I am at
>> }
>> static public main(args)
>> {
>> A objectA=new A();
>> A.methodA();
>> }
>> }
>> Now, as we are calling objectB.methodB() from A.methodA(), all I need
>> is to find out objectA and objectB from within the JVM.
>> Given that from the dtrace functionality, I already know the current
>> thread, and the methodOoopDesc* of the called method, I need to
>> identify the caller object and the callee object from the two
>> parameters passed to the dtrace_method_entry:
>> JRT_LEAF(int, SharedRuntime::dtrace_method_entry( JavaThread* thread,
>> methodOopDesc* method)) in shareRuntime.cpp
>> Thanks!
>> Tony (Xiaohua Guan)
>> On Wed, Apr 21, 2010 at 8:11 PM, David Holmes <David.Holmes at oracle.com> wrote:
>>> Tony,
>>>
>>> Tony Guan said the following on 04/22/10 00:06:
>>>> a quick question: given a caller thread object( JavaThread* thread)
>>>> and the method to be called by the thread (methodOopDesc* method), how
>>>> do I know that the holder of the "method" is from the same caller
>>>> object or not?
>>> I don't understand what you mean here by "holder"?
>>>
>>>> The reason why I am asking is:
>>>> in
>>>> JRT_LEAF(int, SharedRuntime::dtrace_method_entry( JavaThread*
>>>> thread, methodOopDesc* method)) in shareRuntime.cpp
>>>>
>>>> I want to check if the method called will start another thread or not,
>>>> so I need to compare the holders of the caller and callee.
>>> Again I don't know what the "holder" is here. If a method starts a thread
>>> then that new thread doesn't necessarily have any connection back to the
>>> method from which it was started.
>>>
>>>> So one more question: is there any other way to achieve this?
>>> I think you would have to add code in the thread start routine (of the JVM)
>>> and have the before/after method hooks to do this eg:
>>>
>>> before-method: set flag showing current thread is interested in thread
>>> start
>>> start-thread: check if current thread interested in thread start and if so
>>> bump a counter
>>> after-method: check counter and clear flag
>>>
>>> David Holmes
>>>
More information about the hotspot-compiler-dev
mailing list