RFR: 8274771: Map, FlatMap and OrElse fluent bindings for ObservableValue [v18]
John Hendrikx
jhendrikx at openjdk.org
Wed Jul 6 22:41:22 UTC 2022
On Wed, 6 Jul 2022 22:24:36 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:
>> John Hendrikx has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 27 additional commits since the last revision:
>>
>> - Merge branch 'openjdk:master' into feature/fluent-bindings
>> - Add null checks in Subscription
>> - Update copyrights
>> - Move private binding classes to com.sun.javafx.binding package
>> - Add note to Bindings#select to consider ObservableValue#flatMap
>> - Fix bug invalidation bug in FlatMappedBinding
>>
>> Also fixed a secondary issue where the indirect source of the binding
>> was unsubscribed and resubscribed each time its value was recomputed.
>>
>> Add additional comments to clarify how FlatMappedBinding works.
>>
>> Added test cases for these newly discovered issues.
>> - Fix typos in LazyObjectBinding
>> - Rename observeInputs to observeSources
>> - Expand flatMap javadoc with additional wording from Optional#flatMap
>> - Add since tags to all new API
>> - ... and 17 more: https://git.openjdk.org/jfx/compare/a2456300...d66f2ba6
>
>> Let's say we introduce a marker interface that represents a thread-safety guarantee with regards to `addListener` and `removeListener`:
>>
>> ```java
>> interface ConcurrentListenerAccess {}
>> ```
>>
>> Now we can use the existing `Disposer` mechanism to automatically schedule listeners to be removed from `ConcurrentListenerAccess` implementations when the bound property is eligible for collection.
>>
>> It's sufficient to implement `ConcurrentListenerAccess` for `LazyObjectBinding` to make `map` and `flatMap` work the way I'd expect it to work.
>
> You mean by `Disposer` something like `com.sun.prism.impl.Disposer`? I see that it has a `ReferenceQueue` in it, so I'm guessing that's the mechanism you are referring to. How would you want this triggered? I think a thread blocking on the queue might be best.
>
> I think this is a very nice idea to potentially tackle this problem.
> @hjohn Thanks for your detailed analysis of the bindings GC situation. The conclusion I take from all of this is that the current implementation is fine, but we might consider a follow-up issue to clean up dead listener stubs.
>From @mstr2 analysis, it is slightly more than just the stub in the case of the fluent bindings. See illustration below, assuming `caption` is the only hard reference, the dashed boxes represent things that are eligible for GC, dashed lines represent weak references. If `caption` is modified, triggering a clean-up, then everything is eligible for GC aside from `caption`:
![image](https://user-images.githubusercontent.com/995917/177654654-4bb1e4c2-2f6a-49dc-9673-53805047505e.png)
It might be good to fix this right away.
-------------
PR: https://git.openjdk.org/jfx/pull/675
More information about the openjfx-dev
mailing list