From 37c5aa108499104dc417d6b983cb64bcf05f35c2 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Tue, 13 Nov 2018 20:11:22 -0300 Subject: Add a limit of previously known last element to timer timeout traversal in SceneTree, fixes #15559 --- scene/main/scene_tree.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index f7dec77ce4..168cd38ab7 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -535,10 +535,15 @@ bool SceneTree::idle(float p_time) { //go through timers + List >::Element *L = timers.back(); //last element + for (List >::Element *E = timers.front(); E;) { List >::Element *N = E->next(); if (pause && !E->get()->is_pause_mode_process()) { + if (E == L) { + break; //break on last, so if new timers were added during list traversal, ignore them. + } E = N; continue; } @@ -550,6 +555,9 @@ bool SceneTree::idle(float p_time) { E->get()->emit_signal("timeout"); timers.erase(E); } + if (E == L) { + break; //break on last, so if new timers were added during list traversal, ignore them. + } E = N; } -- cgit v1.2.3