<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
Tue Oct 13 16:54:46 UTC 2015

Hello Alexey

> Hello Alex,
> Thank you for your review.
> Here's the updated webrev: 
> http://cr.openjdk.java.net/~aivanov/8130136/jdk9/webrev.01/
> Please see my comments inline.
> On 12.10.2015 20:25, Alexander Potochkin wrote:
>> Hello Alexey
>> The fix looks reasonable.
>> However the javadoc for RemoveDC method should be updated.
>> Could you please describe the new logic there?
> I updated the comment above DCList::RemoveDC to take into account the 
> additional HWND parameter.
>> When does the GetHWnd() method return zero?
>> Do we need to check it in RemoveDC?
> GetHWnd() cannot return NULL in WndProc. No NULL-check is necessary.

As far as I can see AwtComponent::GetHWnd can return zero.


>> 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.
> Regards,
> Alexey
>> Thanks
>> alexp
>> 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