From f4f7496175e146fb465baa02968f95f5977931b8 Mon Sep 17 00:00:00 2001 From: ccp-intern <180460643+ccp-intern@users.noreply.github.com> Date: Tue, 30 Jun 2026 01:04:20 +0200 Subject: [PATCH 1/5] fix crashes regarding ExecuteMainThreadActions --- trinity/ContinueOnMainThread.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/trinity/ContinueOnMainThread.cpp b/trinity/ContinueOnMainThread.cpp index 64376c688..f2ca36668 100644 --- a/trinity/ContinueOnMainThread.cpp +++ b/trinity/ContinueOnMainThread.cpp @@ -19,7 +19,7 @@ void ExecuteMainThreadActions() { CCP_STATS_ZONE( __FUNCTION__ ); - static std::vector> actionsToProcess; + std::vector> actionsToProcess; { std::lock_guard lock( mainThreadActionsMutex ); actionsToProcess.swap( mainThreadActions ); @@ -28,5 +28,4 @@ void ExecuteMainThreadActions() { action(); } - actionsToProcess.clear(); } From 2ab23ba7724336d58080698fcfbbc81b5d5cbb90 Mon Sep 17 00:00:00 2001 From: ccp-intern <180460643+ccp-intern@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:08:13 +0200 Subject: [PATCH 2/5] fix crash without allocations --- trinity/ContinueOnMainThread.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/trinity/ContinueOnMainThread.cpp b/trinity/ContinueOnMainThread.cpp index f2ca36668..38b910cb1 100644 --- a/trinity/ContinueOnMainThread.cpp +++ b/trinity/ContinueOnMainThread.cpp @@ -7,6 +7,7 @@ namespace { std::vector> mainThreadActions; std::mutex mainThreadActionsMutex; +int invocations = 0; } void ContinueOnMainThread( std::function&& action ) @@ -19,13 +20,30 @@ void ExecuteMainThreadActions() { CCP_STATS_ZONE( __FUNCTION__ ); - std::vector> actionsToProcess; + static std::vector> actionsToProcess; + + invocations++; + if( invocations > 1 ) { - std::lock_guard lock( mainThreadActionsMutex ); - actionsToProcess.swap( mainThreadActions ); + return; } - for( auto& action : actionsToProcess ) + + ON_BLOCK_EXIT( [] { + invocations = 0; + actionsToProcess.clear(); + } ); + + while( invocations > 0 ) { - action(); + { + std::lock_guard lock( mainThreadActionsMutex ); + actionsToProcess.swap( mainThreadActions ); + } + for( auto& action : actionsToProcess ) + { + action(); + } + actionsToProcess.clear(); + invocations--; } } From 8457378cb6cce3c3905c195bdbed7f035248359d Mon Sep 17 00:00:00 2001 From: ccp-intern <180460643+ccp-intern@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:28:02 +0200 Subject: [PATCH 3/5] added ScopedBlockTrap to Tr2Controller::Start --- trinity/Controllers/Tr2Controller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/trinity/Controllers/Tr2Controller.cpp b/trinity/Controllers/Tr2Controller.cpp index 63b2de9e8..c956aead3 100644 --- a/trinity/Controllers/Tr2Controller.cpp +++ b/trinity/Controllers/Tr2Controller.cpp @@ -8,6 +8,7 @@ #include "Include/ITr2Updateable.h" #include "../Tr2ExpressionTermInfo.h" #include "ContinueOnMainThread.h" +#include CCP_STATS_DECLARE( controllerUpdateTime, "Trinity/Controllers/UpdateTime", true, CST_TIME, "Cumulative per-frame time for controller update" ); CCP_STATS_DECLARE( controllerUpdateablesTime, "Trinity/Controllers/UpdateablesTime", true, CST_TIME, "Cumulative per-frame time for controller updates tick" ); @@ -201,6 +202,8 @@ bool Tr2Controller::IsLinked() const void Tr2Controller::Start() { + ScopedBlockTrap blockTrap; + if( m_isActive ) { Stop(); From 76cdaeac603acc6c56975393cb810f15773f4ce5 Mon Sep 17 00:00:00 2001 From: ccp-intern <180460643+ccp-intern@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:37:09 +0200 Subject: [PATCH 4/5] Revert "added ScopedBlockTrap to Tr2Controller::Start" This reverts commit 8457378cb6cce3c3905c195bdbed7f035248359d. --- trinity/Controllers/Tr2Controller.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/trinity/Controllers/Tr2Controller.cpp b/trinity/Controllers/Tr2Controller.cpp index c956aead3..63b2de9e8 100644 --- a/trinity/Controllers/Tr2Controller.cpp +++ b/trinity/Controllers/Tr2Controller.cpp @@ -8,7 +8,6 @@ #include "Include/ITr2Updateable.h" #include "../Tr2ExpressionTermInfo.h" #include "ContinueOnMainThread.h" -#include CCP_STATS_DECLARE( controllerUpdateTime, "Trinity/Controllers/UpdateTime", true, CST_TIME, "Cumulative per-frame time for controller update" ); CCP_STATS_DECLARE( controllerUpdateablesTime, "Trinity/Controllers/UpdateablesTime", true, CST_TIME, "Cumulative per-frame time for controller updates tick" ); @@ -202,8 +201,6 @@ bool Tr2Controller::IsLinked() const void Tr2Controller::Start() { - ScopedBlockTrap blockTrap; - if( m_isActive ) { Stop(); From 86979fdfb3a0cf52eb9c0d6e1fc8baba1e6067e0 Mon Sep 17 00:00:00 2001 From: ccp-intern <180460643+ccp-intern@users.noreply.github.com> Date: Tue, 30 Jun 2026 13:03:53 +0200 Subject: [PATCH 5/5] add ScopedBlockTrap in ExecuteMainThreadActions --- trinity/ContinueOnMainThread.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trinity/ContinueOnMainThread.cpp b/trinity/ContinueOnMainThread.cpp index 38b910cb1..fc808491c 100644 --- a/trinity/ContinueOnMainThread.cpp +++ b/trinity/ContinueOnMainThread.cpp @@ -2,6 +2,7 @@ #include "StdAfx.h" #include "ContinueOnMainThread.h" +#include namespace { @@ -39,9 +40,12 @@ void ExecuteMainThreadActions() std::lock_guard lock( mainThreadActionsMutex ); actionsToProcess.swap( mainThreadActions ); } - for( auto& action : actionsToProcess ) { - action(); + ScopedBlockTrap blockTrap; + for( auto& action : actionsToProcess ) + { + action(); + } } actionsToProcess.clear(); invocations--;