[foreign] RFR 8211060: Library.getDefault() does not work on Windows

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Sep 24 12:00:15 UTC 2018

Can you please expand a bit on this?

But also, warning: this is a RFR thread and I don't like it being side 
tracked to re-discuss higher level goals such as modeling headers with 
interfaces. If you want to raise this concern (seems so, but not 100% 
sure), as otherwise stated, please raise that in the appropriate forum 
(panama-spec-experts). Let's keep this list for discussion on the 
prototype, feedback on real usage, bugs, etc.


On 24/09/18 12:38, Samuel Audet wrote:
> FWIW, I think the factory method pattern should be reconsidered 
> entirely. In C/C++, when we want to call say getpid(), we don't start 
> loading stuff up before calling getpid(), we call getpid()! Why not do 
> the same from Java? From a usability point of view, not loading stuff 
> manually works fine for JavaCPP...
> Now, I know you're going to start taking about interfaces and what 
> not. You said that you had plans to introduce an entirely new array 
> type just to make it more friendly with vector instructions and native 
> libraries. Why not start thinking about an "interface" that would be 
> friendly to native libraries as well? Why stop at arrays?
> Samuel
> On 09/24/2018 08:10 PM, Maurizio Cimadamore wrote:
>> Hi Jorn,
>> thanks for the patch. As mentioned last time we have two options 
>> here: one is to follow the approach forward in your patch; another 
>> would be to ditch Library.getDefault() entirely and adopt a more 
>> explicit approach - that is to always require 'implicit' libraries to 
>> be mentioned - either by jextract artifacts or by API points.
>> A note on the latter - when you do:
>> Libraries.bindRaw(lookup, Foo.class)
>> the code lookup the @NativeHeader annotation on Foo.class and tries 
>> to extract required library names from there. Currently, we do not 
>> add library names for standard libraries such as "c" or "m" (math), 
>> which is what led us down the (slippery?) slope of having a 
>> Library.getDefault somewhere.
>> Another option would be to have jextract to always generate the names 
>> of the libraries an artifact depends on, and then the API should 
>> throw an exception if a @NativeHeader is found with no libraries. 
>> More specifically, jextract should always add "c" to the set of used 
>> libraries in the @NativeHeader annotation (other libraries can be 
>> explicitly supplied using the -l flag).
>> Note that I'm not saying "the binder should always add in 'clib'" for 
>> you, because that's kind of a lame assumption: it works obviously 
>> well for C but it doesn't make a lot of sense if you want to use 
>> Panama for other purposes/languages. Which seems to suggest that, as 
>> far as the binder is concerned, library dependencies should always be 
>> explicit.
>> Thoughts?
>> Maurizio
>> On 24/09/18 11:52, Jorn Vernee wrote:
>>> Hello,
>>> I'd like to contribute a patch that adds support for the default 
>>> library on windows.
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8211060
>>> Diff: 
>>> https://gist.github.com/JornVernee/7d45780df082cbfb27417b437c7b13a8
>>> As mentioned before [1], this fixes 2 bugs:
>>> 1.) When no library was loaded ClassLoader#NativeLibrary#getFromClass
>>> threw an NPE (at least on windows). That is fixed by returning
>>> defaultLibrary.fromClass when the nativeLibraryContext is empty.
>>> 2.) The default library search was not working on windows. It was using
>>> a default handle, which works on unix (dlsym(RTLD_DEFAULT)), but not on
>>> windows (see https://stackoverflow.com/q/23437007). I have changed the
>>> implementation from using a default handle to using a new native
>>> function findEntryInProcess, which does the right thing for Windows
>>> (iterate over all loaded modules), and does the same thing it used to
>>> for unix. findEntry is now a Java method, and the original findEntry is
>>> renamed to findEntry0. The NativeLibrary implementation of findEntry
>>> forwards to findEntry0, and the anonymous class of the default library
>>> overrides to forward to findEntryInProcess.
>>> Please test this patch on unix as well, since I don't have the 
>>> ability to do so.
>>> Jorn
>>> [1] : 
>>> http://mail.openjdk.java.net/pipermail/panama-dev/2018-September/002644.html 

More information about the panama-dev mailing list