From OpenJDK discuss:

> On 21 Nov 2021, at 21:55, Alan Bateman <alan.bate...@oracle.com> wrote:
> 
> On 21/11/2021 13:27, Michał Kłeczek wrote:
>> Hello All,
>> 
>> I am looking for a way to associate ModuleLayer.Controller with a Module (or 
>> ModuleLayer) in such a way that it won’t disable garbage collection of 
>> Modules and ModuleLayers.
>> WeakHashMap<ModuleLayer, ModuleLayer.Controller> won’t work as Controller 
>> strongly references its ModuleLayer (which in turn strongly references 
>> Modules).
>> WeakHashMap<ModuleLayer, WeakReference<ModuleLayer.Controller>> won’t work 
>> either cause controller will be garbage collected.
>> 
>> So far I only came up with subclassing a ModuleReference and keeping the 
>> reference to the controller there. This won’t work in case when 
>> ModuleLayer.configuration() is used a a parent configuration.
>> 
>> Am I missing something obvious here?
> You are correct that a module layer doesn't keep the ML.Controller alive. A 
> ML.Controller is somewhat niche object to expand the readability graph or 
> maybe add additional edges to open modules, and then be thrown away. It 
> sounds like you want to keep it around in order to do further opening when 
> additional child layers come into being. One way you could do this is create 
> a module with a holder class to keep the reference. So rather than keeping 
> the reference in the model world (ModuleReference), instead put it as a field 
> in a reified module. With the right encapsulation it should give you the 
> module layer -> Controller without compromising the integrity of the layers. 
> If you want to discuss further then it's probably best to follow-up on 
> jigsaw-dev rather here.
> 


Indeed - a synthetic module providing a holder service might do the job.

Seems somewhat cumbersome though.

Would it be too much to ask for accepting a patch adding a reference to 
ML.Controller to ModuleLayer?
It wouldn’t require changes to the spec I think as the lifetime of 
ML.Controller is unspecified.

— Michal

Reply via email to