<AWT Dev> [OpenJDK 2D-Dev]  Review request for 8130136: Swing window sometimes fails to repaint partially when it becomes exposed
Sergey.Bylokhov at oracle.com
Tue Oct 13 15:38:51 UTC 2015
Can you attach the test, which can be used to check the fix, to the
On 13.10.15 13:15, Alexey Ivanov wrote:
>> I guess you didn't add the test for a good reason,
>> could you please comment on that?
> It's impossible to write a regression test because the failure could be
> caught only from the native AWT code, no user code could detect it.
> Additionally, the time it takes to reproduce the issue is indefinite.
>> On 10/12/2015 12:11, Alexey Ivanov wrote:
>>> Please review the fix for jdk9:
>>> bug: https://bugs.openjdk.java.net/browse/JDK-8130136
>>> webrev: http://cr.openjdk.java.net/~aivanov/8130136/jdk9/webrev.00/
>>> Problem description:
>>> Sometimes a window fails to repaint when it becomes exposed.
>>> When repaint failure occurs, SetDIBitsToDevice() in
>>> GDIBlitLoops_nativeBlit() returns 0 with error 87 ("Parameter
>>> Error"). It happens because invalid, already released, hDC is passed
>>> to SetDIBitsToDevice().
>>> Root cause:
>>> When a window is disposed, the DCs associated with it are released.
>>> The handles can be reused for another window.
>>> A thread disposes the window and releases hDC. At this time, DC
>>> handle is reused for another window. When Disposer thread cleans up
>>> for a died thread, it tries to release the cached hDC. But that
>>> handle is already associated with another window. Thus a valid pair
>>> hWnd/hDC becomes invalid: painting to released DC fails.
>>> The fix:
>>> Save both hDC and hWnd in the thread local storage, and pair hDC with
>>> hWnd when removing it to avoid accidentally releasing hDC which is
>>> already reused for another window.
Best regards, Sergey.
More information about the awt-dev