<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
Wed Oct 14 14:11:47 UTC 2015


Hello Alexey

>>>> 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.
>
> Well, it could... but if it had done so, something bad would already 
> have happened. The code in RemoveDC() won't cause an error if hWnd is 
> NULL, however, an hDC could be leaked.
>
> Anyway, if GetHWnd() returns NULL during message processing, AWT is 
> already screwed up, it would not be able to work correctly.

I looked through the rest of the code, looks like your assumption is 
correct.

The fix looks good to me.

Thanks
alexp

>
> Regards,
> Alexey
>
>>
>> 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 awt-dev mailing list