Linkage.registerBootstrapMethod

Rémi Forax forax at univ-mlv.fr
Mon May 4 04:27:26 PDT 2009


Rémi Forax a écrit :
> 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.
>   
Answering to myself:
the problem of doing 3) at the end of the static block is that this disallow
to use invokedynamic in  the static block.
It appears to me that this is a too strong restriction.

Perhaps we could rely on an explicit call ?

Something like :
Linkage.initializeInvokeDynamic(bootstrapClass, bootstrapMethodName);
that sould be executed by the static block and only once.

>   
>> -- John
>>   
>>     
> Rémi
>   
Rémi

> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>   




More information about the mlvm-dev mailing list