JVM hang with Swing and macOS

Philip Race philip.race at oracle.com
Tue Apr 18 17:52:27 UTC 2023


1) -XstartOnFirstThread  should be thought of more as -XdontStartAnEventLoop
And with no event loop running, yes, UI apps hang.
To understand why the option is named as it is, you need to know that on 
most platforms
and situations the application's "main" method will run on the first 
thread that is started
But on macOS in order to allow the event loop to run on that thread, it 
hops over to another
thread that is created. But with this special option, that doesn't 
happen, so some other code
has a chance to use it for that.
The reason for it is that a toolkit like SWT may come along later and 
start a loop.
It is possible to check there's already a loop (AWT + JavaFX both do) 
but perhaps SWT doesn't ?
In summary this option is not (SFAICS) for your use case and that bug is 
"not a bug" and I've closed it.

2) The class referenced by Sergey

https://github.com/openjdk/jdk/blob/master/src/java.desktop/share/classes/sun/java2d/opengl/OGLUtilities.java

isn't one I know anything about. I can see it pre-dates us even having a 
macOS port, and its completely
unsupported, probably unsupportable, no idea if it actually works, 
especially on macOS.
Not sure if its even a direction you should head down. Caveat emptor. 
Big time.

3) JAWT is a JDK native API that lets you use native code to draw into a 
Java-owned window.
https://docs.oracle.com/en/java/javase/17/docs/specs/AWT_Native_Interface.html
It doesn't provide much more than that. Any rendering that needs to 
happen on a particular thread
etc is out of scope of what it provides.

4) Your error isn't obviously directly opengl related even though it 
mentions "GLUT". Its more about the toolkit.

java[92246:2751169] GLUT Fatal Error: internal error: NSInternalInconsistencyException, reason: NSWindow drag regions should only be invalidated on the Main Thread!

I would have thought that the advice which I think you need (in this 
somewhat confusing thread) people
have already offered and this is to jump onto the main thread when needed.
You can look at the code in the JDK's libosxapp/ThreadUtilities.m as a 
sample to see how you'd do this.
Do not rely on JDK internals. Ultimately you will need to end up using 
this Apple macOS API -
https://developer.apple.com/documentation/objectivec/nsobject/1414900-performselectoronmainthread
- if you aren't already on the main thread that is.
If there's some complication with that which I'm not understanding, I 
don't know what you'd do instead.

I don't have time to look into this any more deeply so this reply must 
be taken as not fully researched,
but it is the best I can offer you.

-Phil

On 3/23/23 4:00 AM, Martin Pernollet wrote:
>
>
>> Start another java process -XstartOnMainThread that does the OpenGL 
>> part from a Swing application?
>
> Sorry I do not understand your question. If you speak about triggering 
> two process with -XstartOnFirstThread, I think they might both freeze. 
> Or worse, one freeze and the other one get kick/stopped by the former.
>
> I can try this next week because I do not have a macOS with me up to 
> next thursday.
>
>> One hang up there though might be that I don’t think java 
>> applications that include the java native commands are allowed in the 
>> Mac App Store. Another bug due to each command has it’s own unique 
>> CFBundleIdentifier but that identifier is always the same and Apple 
>> doesn’t allow duplicates in the App Store.
>
> Being able to deploy on App Store is not an immediate need for me but 
> this is a very interesting point to consider. I'll try to understand 
> how CFBundleIdentifier relates to -XstartOnFIrstThread.
>
> Regards,
>
> Martin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/client-libs-dev/attachments/20230418/eac7ea13/attachment.htm>


More information about the client-libs-dev mailing list