RFR: 8362289: [macOS] Remove finalize method in JRSUIControls.java
Phil Race
prr at openjdk.org
Tue Jul 15 22:36:38 UTC 2025
On Tue, 15 Jul 2025 21:43:04 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:
>> src/java.desktop/macosx/classes/apple/laf/JRSUIControl.java line 115:
>>
>>> 113: flipped = other.flipped;
>>> 114: cfDictionaryPtr = getCFDictionary(flipped);
>>> 115: if (cfDictionaryPtr == 0) throw new RuntimeException("Unable to create native representation");
>>
>> Just a side topic to discuss: In the past I tried to look into this pattern and figure out is it possible for the GC to start cleaning the object after we allocate the native resource but before we register it with Disposer.addRecord. In such a case, the cleanup might never be executed.
>>
>> Perhaps we should consider adding a reachabilityFence at the end of Disposer.addRecord, for both the DisposerRecord and the referent, to ensure they remain reachable. Similarly how it was done for cleaner:
>> https://hg.openjdk.org/jdk9/jdk9/jdk/rev/1f33e517236e
>> Or may be we can just use cleaner.
>
> there is even a bug for Cleaner that the reachabilityFence should be moved to the end of register:
> https://bugs.openjdk.org/browse/JDK-8291867
> If there are no objectiosn I'll add it to the Disposer.addRecord in a separate bug.
I think that would be OK, meaning probably harmless. But I don't know if this case actually requires it.
Where I've seen a problem like this a Java object is used at an earlier point in the method and not again and so becomes eligible to be freed, but some native resource it held is needed later but is already freed along with its no longer references holder.
Here, if this object (the JRSUIControl) becomes unreachable during construction, and so the referent and disposer are also unreachable outside this object, they are still going to be live until we reach code in the constructor which uses them and since the referent and the disposer are passed into addRecord they'll be live there until stored.
But these cases are subtle, maybe I'm missing something. Can you expand on the scenario ?
Or maybe there's some other patterns where we use Disposer that it is needed ?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26331#discussion_r2208837967
More information about the client-libs-dev
mailing list