<AWT Dev> [9] Review request for 8130136: Swing window sometimes fails to repaint partially when it becomes exposed

Alexander Potochkin alexander.potochkin at oracle.com
Mon Oct 12 17:25:57 UTC 2015

Hello Alexey

The fix looks reasonable.
However the javadoc for RemoveDC method should be updated.
Could you please describe the new logic there?

When does the GetHWnd() method return zero?
Do we need to check it in RemoveDC?

I guess you didn't add the test for a good reason,
could you please comment on that?


On 10/12/2015 12:11, Alexey Ivanov wrote:
> Hello,
> 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.
> Regards,
> Alexey

More information about the awt-dev mailing list