Linkage.registerBootstrapMethod

Rémi Forax forax at univ-mlv.fr
Mon May 4 01:25:12 PDT 2009


John Rose a écrit :
> On May 2, 2009, at 5:55 PM, Rémi Forax wrote:
>
>   
>> I badly need it.
>> I want a bootstrap method, a factory method of CallSite because
>> depending on invokedynamic name I want to store different kind of  
>> profile.
>> I think that one bootstrap method that can return different CallSite
>> implementations
>> allow more freedom.
>>     
>
> D'oh!  Thanks.
>
> Indeed, factories are strictly more powerful than classes.
>
> So will this work for you?
>
>    bootstrap-method : method handle = lambda(callsite symbolic info)  
> => (result : CallSite)
>   
yes.
> I think the bootstrap method should not be required to perform any  
> side-effects on the call site; that should be a separate step in the  
> call-site life cycle, embodied in a method.  Did we say the bootstrap  
> method might be allowed to run earlier than the first call, for more  
> eager creation of call sites? (For code prelinking of some sort, not  
> yet invented.)
>   

Earlier means between the call to registerBootstrapMethod  and the first 
call
The problem is that registerBootstrapMethod can be anywhere in the code,
I don't see an analysis that can be used by the VM to find where to
call the BSM earlier.

Furthermore, the BSM itself can be a static method of the class containing
the invokedynamic, so the BSM will be able to run without static fields 
correctly initialized ?

> Then the steps are:
>
> 1. prepare bytecodes & (virtually) allocate target variables,  
> initialized to null (unlinked state)
>
> 2. (before or upon first invocation) call bootstrap method to  
> permanently create CallSite (the JVM may throw an error if BSM hands  
> it a CallSite already attached to a call: this implies invisible JVM  
> cookies are in there somewhere)
>
> 3. at the "first call" (precisely, to an unlinked call site), do  
> CallSite.initialize (which must link the site, else error)
>
> 4. at every call, pick up the non-null target, and just jump through it
>
> 5. once a target is set non-null, it can never go null again, except  
> (perhaps?) at a safepoint as a result of bulk unlinking
>
> A call site is unlinked if and only if its target method is null.  And  
> setTarget(null) is always rejected.
>
> As it is currently coded, steps 2 and 3 might happen several times,  
> either by racing threads as with the other invoke bytecodes, or in  
> this case via re-entrant execution (probably a user error, but maybe  
> not!).
>
> Yes, racing threads can redundantly link, but the process is all one- 
> way, monotonic, so it completes.  And it doesn't run bytecodes, except  
> to load classes, which serializes through a system dictionary lock.   
> For the interpreter linkage logic, see the hotspot sources, routine  
> InterpreterRuntime::resolve_invoke.
>
> The odd thing with 292 is that, because we are using upcalls that run  
> Java code, the application code (the MOP) can witness the races as  
> they occur.  We could serialize those events, with some care to avoid  
> DOS attacks and unintentional interference between unrelated code.   
> Sounds like more trouble that it's worth.  The JVM can promise to pick  
> a winner and commit at most one CallSite object per bytecoded call  
> site.  I suppose that's an issue for the EG to worry about.
>   

I see a way to avoid thread race.
The idea is to mandate that registerBootstrap method is always called 
before the initialization
of the static block ends.
In that case, 2 and 3 can be done under the lock used to initialize the 
static block.

In fact, I don't care if 3 is called more than once if it's documented 
in the spec.
But I don't like the fact that a call site created by the BSM is garbaged.
Users may want to maintain a list of call sites (for invalidations?) and 
I don't see
how to do that if step 2 can produce call sites than will not be used.

> -- John
>   
Rémi



More information about the mlvm-dev mailing list