Hi 2d folks, We have an application running on OpenJDK6 that seems to be deadlocking in SunGraphicsEnvironment. I found it rather difficult to write a cut-down reproduction, but the errant lock acquisition is on line 482 of SunGraphicsEnvironment.java.:
http://hg.openjdk.java.net/jdk6/jdk6-gate/jdk/file/f9fa5c538031/src/share/classes/sun/java2d/SunGraphicsEnvironment.java After the lock is acquired, it goes on to call FontManager.initialiseDeferredFonts() on line 467, which acquires the other lock. It looks as if you might be able to move the lock acquisition from line 462 to 468, which would eliminate the deadlock. The code looks pretty similar in recent OpenJDK7 builds (although the line numbers are changed). The relevant stacks follow. It seems like a pretty easy fix for a pretty nasty problem. Any chance someone could take a look? Thanks! Thread 1: sun.font.FontManager.initialiseDeferredFonts(FontManager.java:791) sun.java2d.SunGraphicsEnvironment.loadFonts(SunGraphicsEnvironment.java:467) sun.awt.X11GraphicsEnvironment.loadFonts(X11GraphicsEnvironment.java:885) sun.font.FontManager.findFont2D(FontManager.java:1995) java.awt.Font.getFont2D(Font.java:473) java.awt.Font.getFontName(Font.java:1221) java.awt.Font.getFontName(Font.java:1203) Thread 2: sun.java2d.SunGraphicsEnvironment.loadFonts(SunGraphicsEnvironment.java:463) sun.awt.X11GraphicsEnvironment.loadFonts(X11GraphicsEnvironment.java:885) sun.font.FontManager.findFont2D(FontManager.java:1995) sun.font.FontManager.getDefaultPhysicalFont(FontManager.java:1071) sun.font.FontManager.initialiseDeferredFont(FontManager.java:960) sun.font.FontManager.findJREDeferredFont(FontManager.java:875) sun.font.FontManager.findDeferredFont(FontManager.java:912) <snip lots of recursion> sun.font.FontManager.findFont2D(FontManager.java:1904) sun.font.FontManager.findFont2D(FontManager.java:1865) java.awt.Font.getFont2D(Font.java:473) java.awt.Font.getFontName(Font.java:1221) java.awt.Font.getFontName(Font.java:1203)
