RFR: 8223296: NullPointerException in GlassScene.java at line 325
Ambarish Rapte
arapte at openjdk.java.net
Fri Dec 13 10:48:46 UTC 2019
On Thu, 12 Dec 2019 23:29:11 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:
>>> 1. In addition to calling the synchronized `setTKScenePaintListener` method, you moved the call to the beginning of `dispose`. Is there a reason you needed to do this?
>>
>> This is moved only to make first operation when disposing. However the race condition is very rare, but this will just reduce the chances little more.
>>
>>> 2. Do any of the other listeners or variables that are set in `dispose` have the same problem (i.e., are any of the rest accessed from another thread)?
>>
>> Other variable do not have a race condition. All are set or accessed on JavaFX Application thread.
>> There are some other variable (not in dispose()) like entireSceneDirty, painting, which are accessed on both threads but those are synchronized access.
>
>> This is moved only to make first operation when disposing. However the race condition is very rare, but this will just reduce the chances little more.
>
> Can you elaborate? Why would there still be a race condition?
> Can you elaborate? Why would there still be a race condition?
Hi Kevin, Looks like I made a confusing statement.
There won't be a race condition after this change but there can be a situation when `frameRendered()` gets executed while `dispose()` is in progress.
Consider scenario:
1. `dispose()` is called on Application thread, and `setTKScenePaintListener(null)` is not executed yet.
2. `frameRendered()` is called on Renderer thread, and it will find that scenePaintListener is not null and `scenePaintListener.frameRendered()` call will be executed.
3. Then `dispose()` executes `setTKScenePaintListener(null)`
If `setTKScenePaintListener(null)` is the first operation in 'dispose()' then chances of above situation reduce little more. However the situation is very rare.
This is to make it more sure that `scenePaintListener.frameRendered()` does not get executed once `dispose()` has begun.
-------------
PR: https://git.openjdk.java.net/jfx/pull/64
More information about the openjfx-dev
mailing list