On Tue, 6 Jun 2023 18:19:00 GMT, Phil Race <[email protected]> wrote:

>> **Problem description**
>> 
>> If you grab the thumb of the scroll bar of `ScrollPane` and drag it slowly 
>> and continuously up and down, you'll notice the UI stops rendering 
>> correctly: the child component of the scroll pane will render on the left of 
>> the frame itself, the inside of the scroll pane will be filled with the 
>> background color of its child component.
>> 
>> **Root cause**
>> 
>> AWT calls the 
>> [`::SetScrollInfo`](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setscrollinfo)
>>  function on EDT when AWT processes scroll bar tracking events. This Windows 
>> API is not thread-safe, calling this function on an incorrect thread leads 
>> to leaking GDI objects.
>> 
>> When the process reaches the limit on the number of GDI objects, it cannot 
>> create new GDI objects, which results in rendering issues.
>> 
>> **Fix**
>> 
>> To resolve the problem, I modified the code so that `::SetScrollInfo` and 
>> [`::GetScrollInfo`](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getscrollinfo)
>>  are always called on the toolkit thread, all AWT components are created on 
>> the toolkit thread.
>> 
>> An automatic test is provided. The test scrolls the vertical scroll bar up 
>> and down. Then the test takes a screenshot. When the bug is reproduced, the 
>> robot cannot create new GDI objects to capture the screenshot and it throws 
>> `OutOfMemoryError`.
>
> src/java.desktop/windows/native/libawt/windows/awt_ScrollPane.cpp line 745:
> 
>> 743:     ssps->y = y;
>> 744: 
>> 745:     
>> AwtToolkit::GetInstance().InvokeFunctionLater(AwtScrollPane::_SetScrollPos, 
>> ssps);
> 
> Whereas in the _GetOffset case above, you clearly need to wait until the 
> result is returned - I guess
> you didn't see a need to block here ? Or the case below ?

I had a similar clarification as to why it was `InvokeFunction` for 
`_getOffset` and `InvokeFunctionLater` for `_SetScrollPos` and `_SetSpans`. The 
above discussion makes it clear.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14338#discussion_r1220134013

Reply via email to