Null Callbacks
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Sun Feb 17 21:33:47 UTC 2019
Thanks for your patience Mark. I know that trying out stuff and hitting
roadblock is frustrating. Part of it is the normal process of moving the
Panama bits more towards a production ready quality. Which is why I'd
like to iterate faster on the binary snapshot - so that we can make the
most of the feedback we receive - and you can get the most out of Panama.
Thanks again for helping us getting better.
Cheers
Maurizio
On 17/02/2019 00:07, Mark Hammons wrote:
> If it's going to be fixed early next week, I'll probably put my
> project on hold till then. I don't see much point in putting in a
> manual workaround that might not be necessary (and will need to be
> ripped out) in a week or less. I'm going to research some other
> projects in the meantime that may be useful when it comes to this.
> Thanks for your help Jorn and Maurizio,
>
> Mark
>
> On 2/16/19 10:46 PM, Maurizio Cimadamore wrote:
>> Sorry to hear about this.
>>
>> The problems you mention should be fixed early next week - as Jorn
>> said, there are places where you can get builds from - but I also
>> don't see why we couldn't refresh the binary snapshot. It seems like
>> these issues are common enough that will probably be encountered by
>> other developers too, and it is very hard to workaround them.
>>
>> Speaking of workarounds, as Jorn mentioned - the key is having a
>> function in some header which mentions that problematic struct. Maybe
>> there is some other header with a function that takes that struct as
>> an argument, or that returns it? Or, maybe, an hacky workaround would
>> be to create one such header by hand and bind it?
>>
>> Maurizio
>>
>> On 16/02/2019 15:48, Mark Hammons wrote:
>>> I'll keep that in mind Jorn, thanks. I found an alternative
>>> workaround (I found the default function that was being used in
>>> place of the callback if the callback was null, and just turned that
>>> into my callback), but now it seems I'm truly blocked by the issue I
>>> posted about yesterday: Exception in thread "main"
>>> java.lang.UnsupportedOperationException: bitsSize on Unresolved.
>>>
>>> Using jextract on wlroots introduced a lot of new headers, and a lot
>>> of cross-header dependencies. There's a struct defined as:
>>>
>>> ```
>>>
>>> @NativeStruct("[${wl_signal}(destroy)${wl_signal}(new_input)${wl_signal}(new_output)](anon$backend_h$444)")
>>>
>>> public interface anon$backend_h$444 extends
>>> Struct<backend.anon$backend_h$444> {
>>> @NativeLocation(
>>> file = "/usr/include/wlr/backend.h",
>>> line = 23,
>>> column = 20
>>> )
>>> @NativeGetter("destroy")
>>> wl_signal destroy$get();
>>>
>>> @NativeSetter("destroy")
>>> void destroy$set(wl_signal var1);
>>>
>>> @NativeAddressof("destroy")
>>> Pointer<wl_signal> destroy$ptr();
>>>
>>> @NativeLocation(
>>> file = "/usr/include/wlr/backend.h",
>>> line = 25,
>>> column = 20
>>> )
>>> @NativeGetter("new_input")
>>> wl_signal new_input$get();
>>>
>>> @NativeSetter("new_input")
>>> void new_input$set(wl_signal var1);
>>>
>>> @NativeAddressof("new_input")
>>> Pointer<wl_signal> new_input$ptr();
>>>
>>> @NativeLocation(
>>> file = "/usr/include/wlr/backend.h",
>>> line = 27,
>>> column = 20
>>> )
>>> @NativeGetter("new_output")
>>> wl_signal new_output$get();
>>>
>>> @NativeSetter("new_output")
>>> void new_output$set(wl_signal var1);
>>>
>>> @NativeAddressof("new_output")
>>> Pointer<wl_signal> new_output$ptr();
>>> }
>>>
>>> ```
>>>
>>> and it cannot be instantiated. The ```val l2 =
>>> Libraries.bind(MethodHandles.lookup(), classOf[wlroots.backend])```
>>> trick that worked yesterday doesn't work for this either so I'm
>>> kinda roadblocked.
>>>
>>> Mark
>>>
>>> On 2/16/19 4:31 PM, Jorn Vernee wrote:
>>>> Hi Mark,
>>>>
>>>> An API for getting a null callback is currently in the process of
>>>> being added [1].
>>>>
>>>> In the meantime, there is a way to work around this, but it's
>>>> tricky since there doesn't seem to be a public API for parsing a
>>>> Function descriptor, or a public API to easily get a layout for a
>>>> NativeCallback class (will make a note of that as well). AFAICT it
>>>> currently requires manually constructing the Function descriptor
>>>> for the callback. But, you should be able to use something like this:
>>>>
>>>> ```
>>>> @NativeCallback("()v")
>>>> public interface FI1 {
>>>> void run();
>>>> }
>>>>
>>>> public static <T> T pointerLiteral(LayoutType<T> type, long
>>>> value) {
>>>> try(Scope scope = Scope.newNativeScope()) {
>>>> Pointer<Long> ptr = scope.allocate(NativeTypes.UINT64);
>>>> ptr.set(value);
>>>> return ptr.cast(NativeTypes.VOID).cast(type).get();
>>>> }
>>>> }
>>>>
>>>> public static void main(String[] args) {
>>>> Function f = Function.ofVoid(false,
>>>> NativeTypes.VOID.layout());
>>>> Address a = Address.ofFunction(64, f);
>>>> Callback<FI1> nullCB =
>>>> pointerLiteral(LayoutType.ofFunction(a, FI1.class), 0);
>>>> System.out.println(nullCB.entryPoint().isNull()); // prints
>>>> 'true'
>>>> }
>>>> ```
>>>>
>>>> Hope that helps,
>>>> Jorn
>>>>
>>>> [1] :
>>>> https://mail.openjdk.java.net/pipermail/panama-dev/2019-February/004373.html
>>>>
>>>> Mark Hammons schreef op 2019-02-16 15:53:
>>>>> Hi,
>>>>>
>>>>> I'm back with a new wayland problem. More specifically, my problem is
>>>>> with a helper library called wlroots. One of its functions,
>>>>> wlr_backend_autocreate takes a function pointer as an argument. The
>>>>> big problem here is that jextract represents this as a Callback<Fi1>,
>>>>> and part of the valid input for this parameter is the null
>>>>> pointer. So
>>>>> the question is, how do I create a null callback? Can it even be done
>>>>> with foreign as it's currently made?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Mark Hammons
More information about the panama-dev
mailing list