[OpenJDK 2D-Dev] [14] RFR JDK-8235147: Release HDC from passiveDCList sooner

Alexey Ivanov alexey.ivanov at oracle.com
Mon Dec 9 21:26:42 UTC 2019


Hi Sergey

On 04/12/2019 22:17, Sergey Bylokhov wrote:
> On 12/4/19 6:06 am, Alexey Ivanov wrote:
>> Yes, we still need passiveDCList. A DC can be moved to the passive 
>> list by DisposeThreadGraphicsInfo function in 
>> GDIWindowSurfaceData.cpp. This is called not on the toolkit thread, 
>> so we have to defer releasing the DC in this case.
>>
>> However, I agree, we can simplify releasing DCs when on the toolkit 
>> thread by skipping the passive list. Yet having two different 
>> approaches could be error prone.

I actually tried this approach. It may look a bit simpler with three 
functions:
ReleaseActiveDCs(HDC hDC, HWND hWnd)
ReleaseActiveDCs(HWND hWnd)
ReleasePassiveDCs()

Yet in the majority of cases, the DC is moved to passive list using 
MoveDCToPassiveList from SetupThreadGraphicsInfo. It's done before a new 
DC is gotten.

I implemented ReleaseActiveDCs so that the DCs are released bypassing 
the passive list. However in my testing, DCs are never released from the 
active list; the exception to this rule being frame destruction where 
all DCs for a window are released.

>
> Ok, then let's leave the current fix as-is.
>

Taking into account my comments above, I believe it's better to leave 
the fix as is without further modifications.

I'm not sure if replacing
ReleaseDCList(passiveDCList);
with
ReleasePassiveDCs()
would make the code clearer. Probably not. With the explicit list 
parameter, the call ReleaseDCList(GetHWnd(), activeDCList) in 
WM_AWT_RELEASE_ALL_DCS seems more consistent.

Alternatively, we can add MoveDCToPassiveList(HWND) which will move all 
DCs for the HWND from active list to passive list. Then the code would 
be consistent:
MoveDCToPassiveList(HDC, HWND) or MoveDCToPassiveList(HWND)
followed by ReleasePassiveDCs()

It could work. I'll try this approach.

-- 
Regards,
Alexey


More information about the 2d-dev mailing list