RFR: JDK-8269921 Text in Textflow and listeners on bounds can cause endless loop/crash and other performance issues [v4]
Florian Kirmaier
fkirmaier at openjdk.org
Wed Sep 21 12:08:55 UTC 2022
On Mon, 22 Aug 2022 09:46:24 GMT, Florian Kirmaier <fkirmaier at openjdk.org> wrote:
>> It's "a bit" complicated.
>> In some situations, getRuns get's called because listeners on bounds are set.
>> This causes TextFlow to layout to compute the runs.
>> Afterward, the bounds of the parents get updated.
>> This triggers a call to compute bounds - which cascades up to the children.
>> When the geometry of the previous Text gets computed in this big stack - it throws an nullpointer.
>> The Text doesn't have its runs, and calling TextFlow.layout is now a noop (it detects repeated calls in the same stack)
>>
>> In the case it happened - it didn't repair and the application kinda crashed.
>> This bug most likely can also be triggered by ScenicView or similar tools, which sets listeners to the bounds.
>> It also can cause unpredictable performance issues.
>>
>> Unit test and example stacktrace are in the ticket.
>>
>> The suggested fix makes sure that recomputing the geometry of the Text, doesn't trigger the layout of the TextFlow.
>> The Textflow should be layouting by the Parent.
>> This might change the behavior in some cases, but as far as I've tested it works without issues in TextFlow Heavy applications.
>>
>> Benefits:
>> * Better Tooling Support For ScenicView etc.
>> * Fixes complicated but reproducible crashes
>> * Might fix some rare crashes, which are hard to reproduce
>> * Likely improves performance - might fix some edge cases with unpredictable bad performance
>
> Florian Kirmaier has updated the pull request incrementally with one additional commit since the last revision:
>
> JDK-8269921
> Reverted the change to the layout, so we can fix the main-bug without further discussions.
The simple null check helps in this case.
But sometimes I see the exception, posted by @Maran23 .
So the root cause is probably not fixed - but the symptoms are.
I guess, this PR is then a good progress.
Imo the main issue is, that having listeners on the bounds causes a change in the behavior of TextFlow and Group - causing unpredictable behavior.
-------------
PR: https://git.openjdk.org/jfx/pull/564
More information about the openjfx-dev
mailing list