On Tue, 6 Jun 2023 18:17:42 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 704:
> 
>> 702:     gos->orient = orient;
>> 703: 
>> 704:     return 
>> static_cast<jint>(reinterpret_cast<INT_PTR>(AwtToolkit::GetInstance().InvokeFunction(
> 
> So this needs to block until the toolkit thread can process this and return, 
> but since its
> directly called from Java (ie we are in a JNI method) I think this is likely 
> fine.

That's right.

In addition to that, `WScrollPanePeer.getScrollOffset` is unused, so it's never 
called.

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

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

Reply via email to