<AWT Dev> [OpenJDK 2D-Dev] [9] Review request for 8130136: Swing window sometimes fails to repaint partially when it becomes exposed
Alexey Ivanov
alexey.ivanov at oracle.com
Fri Oct 16 11:08:25 UTC 2015
Hi Sergey,
On 15.10.2015 16:52, Sergey Bylokhov wrote:
> On 14.10.15 17:11, Alexander Potochkin wrote:
>> The fix looks good to me.
>
> +1
Thank you for your review.
Regards,
Alexey
>
>>
>> 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