Hi Peter,

On 16/08/16 13:52, Peter Levart wrote:
Ah, I see. Right. Of course, my bad.

In that case, there is a possible race that could lead to exception here:

 476             // add new Level.
 477             Level levelObject = new Level(name, x);
 478             return KnownLevel.findByValue(x,
KnownLevel::referent).get();

...between lines 477 and 478 and between lines 377 and 378, the newly
constructed Level object could already get GC-ed and so findByValue
could return an empty Optional.

You should do something like:

Level levelObject = new Level(name, x);
Level result = KnownLevel.findByValue(x, KnownLevel::referent).get();
Reference.reachabilityFence(levelObject);
return result;

That's what I did in the very first version of the patch,
but Chris commented that this was unnecessary because when
level.getClass() == Level.class then levelObject == mirroredLevel.
Chris found that using Reference.reachabilityFence(levelObject)
just added more mystery - so I removed the statement.

best regards,

-- daniel



Regards, Peter

Reply via email to