[OpenJDK 2D-Dev] <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.

Thanks
alexp

>
>>
>> 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 2d-dev mailing list