On Wed, 3 May 2023 11:46:50 GMT, buedi <d...@openjdk.org> wrote:

> A null pointer exception occurs on the ScenePulseListener when iterating 
> through the dirty node list.
> A null check is needed on the node before calling node.getScene().
> 
> The error occurs occasionally and causes the application to crash.

Hi @buedi, I've taken a look at this, but would like to know the root cause. I 
get the impression that this happens a lot for you, could you share when this 
happens so I can reproduce this as well?

You could also try this code and report back if you get any of the exceptions I 
added:

        private void synchronizeSceneNodes() {
            Toolkit.getToolkit().checkFxUserThread();

            Scene.inSynchronizer = true;

            // if dirtyNodes is null then that means this Scene has not yet been
            // synchronized, and so we will simply synchronize every node in the
            // scene and then create the dirty nodes array list
            if (Scene.this.dirtyNodes == null) {
                // must do this recursively
                syncAll(getRoot());
                dirtyNodes = new Node[MIN_DIRTY_CAPACITY];

            } else {
                if (peer == null) {
                    throw new IllegalStateException("peer shouldn't be null 
here: " + dirtyNodesSize);
                }

                // This is not the first time this scene has been synchronized,
                // so we will only synchronize those nodes that need it
                for (int i = 0 ; i < dirtyNodesSize; ++i) {
                    try {
                        Node node = dirtyNodes[i];
                        dirtyNodes[i] = null;
                        if (node.getScene() == Scene.this) {
                            node.syncPeer();
                        }
                    }
                    catch (Throwable e) {
                        throw new IllegalStateException("exception will break 
dirtyNodes!", e);
                    }
                }
                dirtyNodesSize = 0;
            }

            if (!Scene.inSynchronizer) {
                throw new IllegalStateException("Synchronizer flag was reset, 
reentrant call?");
            }

            Scene.inSynchronizer = false;
        }

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1123#issuecomment-1534538130

Reply via email to