Fix memory corruption caused by rapid project/scene change

This commit is contained in:
justburner 2022-07-16 13:32:00 +01:00 committed by manongjohn
parent 78f349ff85
commit 4f3b844753

View file

@ -1,4 +1,4 @@
#include <QTimer>
#include "toonz/tscenehandle.h" #include "toonz/tscenehandle.h"
@ -24,7 +24,22 @@ ToonzScene *TSceneHandle::getScene() const { return m_scene; }
void TSceneHandle::setScene(ToonzScene *scene) { void TSceneHandle::setScene(ToonzScene *scene) {
if (m_scene == scene) return; if (m_scene == scene) return;
emit sceneSwitching(); emit sceneSwitching();
delete m_scene; ToonzScene *oldscene = m_scene;
m_scene = scene; m_scene = scene;
if (m_scene) emit sceneSwitched(); if (m_scene) emit sceneSwitched();
// Prevent memory corruption caused by delayed signals writing into the
// discarded old scene while that memory was freed.
// That made OT had a chance of crashing when project or scene changed rapidly.
// Note: This is not the best solution but "it just works"
if (oldscene) {
QTimer *delayedTimer = new QTimer(this);
delayedTimer->setSingleShot(true);
connect(delayedTimer, &QTimer::timeout, [=]() {
delete oldscene;
delayedTimer->deleteLater();
});
delayedTimer->start(3000); // 1 sec was enough, but... dunno about toasters
}
} }