static initialisation of javafx.stage.Screen causing problems with clojure

Peter Levart peter.levart at gmail.com
Mon Mar 25 15:41:23 UTC 2019


Hi Razvan,

I don't know Clojure but if this happens during compilation of Clojure 
source(s) (in clojure.lang.Compile), then the question is: Does Clojure 
compiler really need to execute static initializers of classes it is 
"resolving"? It seems it needs to load the classes (presumably because 
it is using Java reflection to introspect them), but does it really need 
to initialize the classes?

If it only needs to introspect the classes (but not execute constructors 
or methods in them or access fields), then it should be using the 3-arg 
Class.forName() method:

      public static Class<?> forName(String name, boolean initialize, 
ClassLoader loader)

...passing 'false' as the 2nd argument. That way the "resolved" classes 
would be loaded but not initialized. Clojure compiler could still 
introspect them, but no code in classes would be executed. This would be 
much safer.

Regards, Peter


On 3/24/19 3:16 PM, Răzvan Rotaru wrote:
> Hi,
>
> I am trying to use OpenJFX 11.0.2 (for Linux) with Clojure and
> https://github.com/fn-fx/fn-fx, and stumbled upon a problem for which I
> would like to ask for advice here. The Problem occurs during compilation of
> some clojure code, which triggers class loading for javafx.stage.Screen,
> which fails with following stack trace (only the relevant part):
>
> java.lang.IllegalStateException: This operation is permitted on the event
> thread only; currentThread = main
>      at com.sun.glass.ui.Application.checkEventThread(Application.java:441)
>      at com.sun.glass.ui.Screen.setEventHandler(Screen.java:369)
>      at
> com.sun.javafx.tk.quantum.QuantumToolkit.setScreenConfigurationListener(QuantumToolkit.java:684)
>      at javafx.stage.Screen.<clinit>(Screen.java:74)
>      at java.base/java.lang.Class.forName0(Native Method)
>      at java.base/java.lang.Class.forName(Class.java:398)
>      at clojure.lang.RT.classForName(RT.java:2207)
>      at clojure.lang.RT.classForName(RT.java:2216)
>      at clojure.lang.Compiler.resolveIn(Compiler.java:7394)
>      at clojure.lang.Compiler.resolve(Compiler.java:7357)
>      at clojure.lang.Compiler.analyzeSymbol(Compiler.java:7318)
>      at clojure.lang.Compiler.analyze(Compiler.java:6768)
>      at clojure.lang.Compiler.analyze(Compiler.java:6745)
>      at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3888)
>
> Being only compilation, there should be no Toolkit initialisation, hence no
> event thread. Looking at the code it seems that the Screen class can only
> be loaded from the event thread. Is this a bug or the intended behaviour?
> Is there a way around this for my use case? How does OpenJFX ensure that
> Screen is always loaded on the correct thread?
>
> Related bug in fn-fx: https://github.com/fn-fx/fn-fx/issues/25
>
>
> Cheers,
> Răzvan
>



More information about the openjfx-dev mailing list