RFC: Refactoring SystemABI
Jorn Vernee
jbvernee at xs4all.nl
Tue Dec 4 01:17:46 UTC 2018
> 1) pass it as argument to a native function (this is the use case you
> have in mind)
I think Henry has a point here; A function that takes a function pointer
currently mostly takes a Callback as argument on the Java side (at least
that's how jextract models it right?). So to satisfy this scenario, we
either need a way to convert a Pointer to a Callback, or return a
Callback from SystemABI::upcallStub outright.
> But Callback is a higher level construct
> in my view - it requires a Scope and a functional interface, none of
> which are necessarily available in this low level view. Is there a
> lower level view to speak about function pointers?
Java doesn't have function types. The closest to that is a functional
interface type, add a pointer to that and you basically have a Callback.
The association with a scope only comes from the Pointer being
associated with a scope. In a sense I feel like Callback is just a way
to put a (pseudo) function type on a Pointer<?>.
I think Callback is a low-level enough abstraction. Maybe
SystemABI::upcallStub could return a `Callback<?>` ? Initially the
functional interface class would be null, and we could add a `<R>
Callback<R> cast(Class<R> cls);` method to Callback to convert it to
another type. The Callback implementation could save the
NativeMethodType to check if a cast is valid.
> I believe one way to solve the issue could be by tweaking the
> SystemABI to accept a Pointer<?> also as an entry point for a downcall
This seems like a good idea to me; split the Library.Symbol parameter
into `String name` and `Pointer<?> address` parameters, and then make
the name parameter optional (with an overload). If we end up going with
SystemABI::upcallStub returning a Callback, it already has a way to
retrieve the entry point Pointer as well.
> - we can check the validity of the Pointer in Linux by calling dladdr
Not all function pointers are associated with a symbol. Symbols of
internal functions are entirely optional for native code to have, but
you still want to be able to have function pointers for them. There's
also generated code which might not have a symbol associated with it. I
think trying to validate the pointers is going a step too far.
Jorn
Maurizio Cimadamore schreef op 2018-12-04 01:08:
> On 03/12/2018 22:02, Henry Jen wrote:
>>
>>> On Dec 3, 2018, at 1:21 PM, Maurizio Cimadamore
>>> <maurizio.cimadamore at oracle.com> wrote:
>>>
>>>
>>> On 03/12/2018 20:19, Henry Jen wrote:
>>>> This looks good, I tried to have bound MH before, but because of
>>>> that test, I decided to keep it as is as I thought that’s what we
>>>> wanted.
>>>>
>>>> By adding the UpcallInvoker, we basically achieve the same thing for
>>>> Java code invoke callback from Java land, but that add cost to every
>>>> NativeInvoker allocation, perhaps it should remains in
>>>> CallbackImplGenerator as I expect this will only be used by binder?
>>> Not really - if you only interact with SystemABI, you don't even see
>>> CallbackImplGenerator. So, SystemABI hands you back a Pointer<?>, how
>>> do you call it?
>>>
>> This is what I meant, upcall is for native to call java. This
>> Pointer<?> is only interact with native calls, that is, when pass a
>> function pointer to native API.
>>
>> For Java to call Java, there is absolutely no reason to go via this
>> path.
>>
>> In case you get back a function pointer from native call and want to
>> make call into it, isn’ t that suppose to deref the pointer and get
>> the functional interface?
>
> There are two possible uses for a Pointer you get back from
> SystemABI::upcallStub:
>
> 1) pass it as argument to a native function (this is the use case you
> have in mind)
>
> 2) pass it as the entry point of a native function
>
> I think that, for completeness, both should be supported; let's say I
> have a native function returning a pointer to function; how do I call
> that function pointer using SystemABI?
>
> Perhaps, you are saying that a function that returns a function
> pointer will return a Callback object - which then can be used to get
> to the functional interface. But Callback is a higher level construct
> in my view - it requires a Scope and a functional interface, none of
> which are necessarily available in this low level view. Is there a
> lower level view to speak about function pointers? My bet was that you
> can do 99% of function pointer just by passing void pointers around,
> and teaching SystemABI how to deal with 'its own' pointers.
>
> Which is almost correct, but, as noted in my previous email, there's a
> slight mismatch between what is the input of SystemABI::downcallHandle
> and what's the output of SystemABI::upcallStub (or the return value of
> a native function returning a function pointer modeled as a
> Pointer<?>).
>
> I believe one way to solve the issue could be by tweaking the
> SystemABI to accept a Pointer<?> also as an entry point for a downcall
> - we can check the validity of the Pointer in Linux by calling dladdr:
>
> http://man7.org/linux/man-pages/man3/dladdr.3.html
>
> Dunno if there is something similar for windows... I found this:
>
> https://docs.microsoft.com/en-us/windows/desktop/api/Dbghelp/nf-dbghelp-symfromaddr
>
> but seems related to debugging (although that seems to be used by
> Hotspot as well).
>
> Maurizio
More information about the panama-dev
mailing list