Hi guys!
Here is the description of CR:
http://bugs.sun.com/view_bug.do?bug_id=7082294
Patch with changes attached.
Description of the fix:
Sometimes execution of AwtObjectList::Cleanup() could be delayed
by
posting WM_AWT_OBJECTLISTCLEANUP message.
From the other side this method is called from
AwtToolkit::Dispose().
There AwtObjectList::Cleanup() is followed by AwtFont::Cleanup().
Thus, sometimes we could have the situation when
AwtFont::Cleanup() is
called before the main functionality of AwtObjectList::Cleanup().
It means that all HFONT objects would be deleted from
AwtFontCache.
So when AwtFont::Dispose() would be called from
AwtObjectList::Cleanup()
it would not find HFONT in AwtFontCache and would try to delete
HFONT
(that is deleted in AwtFontCache) once again.
There is also a custom message pump in AwtToolkit::Dispose() that
allows
posted WM_AWT_OBJECTLISTCLEANUP be handled.
If we move AwtFont::Cleanup() right after that message pump we
guarantee
that AwtObjectList::Cleanup() would always be called before
AwtFont::Cleanup().
That what my fix is about.
PS: I also left my changes in AwtFont to emilinate invalid HFONT
usage
and access violation probability between AwtFont::Dispose() and
AwtFont::~AwtFont() calls.
PPS: This implementation is a kind of workaround for 7u4. As for
JDK 8 - font caching should be improved.
Thanks,
Oleg.