[OpenJDK 2D-Dev] Deadlock in SunGraphicsEnvironment / FontManager?

Jeremy Manson jeremymanson at google.com
Thu Oct 1 19:11:02 UTC 2009


Does anyone have any thoughts about this?  If we were to make up a
patch, would you take it?

I did get an email about how this should all be single threaded on an
event dispatcher thread, to which I would reply:

1) If it is all supposed to be single threaded, then there shouldn't
be any locks in it to cause a deadlock, and

2) This is in the font code, and you can use fonts for things other
than drawing to the screen (in this case, they are trying to render a
PDF).

Jeremy

On Wed, Sep 23, 2009 at 5:16 PM, Jeremy Manson <jeremymanson at google.com> wrote:
> 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)
>



More information about the 2d-dev mailing list