When both the Sequencer Editor and an Animation Curve Editor are open for the same animation asset, the editor freezes completely upon editing the curve.
Analysis indicates that the freeze is caused by a deadlock inside UAnimationSequencerDataModel::Evaluate, where FScopeLock Lock(&EvaluationLock) never returns due to contention with Control Rig evaluation running in a parallel animation thread.
1. Download the repro project from the attachment.
2. Open the project with UE5.6.1 or UE5.7
3. Open the level sequencer asset “test_data” under the project’s Content root folder. (test_data contains an animation track assigned to SKM_Quinn_Simple using the animation asset MM_Fall_Loop.)
4. With the Sequencer still open, open the MM_Fall_Loop animation asset in the Animation Editor.
5. Select the curve “disablehandikretargeting” and open it in the Curve Editor.
6. Attempt to move or edit the curve keys.
7. The entire editor freezes and must be terminated manually.
From UE5.6.1
[External Code]
> UnrealEditor-AnimationData-Win64-Debug.dll!UE::TScopeLock<UE::FWindowsRecursiveMutex>::TScopeLock<UE::FWindowsRecursiveMutex>(UE::FWindowsRecursiveMutex & InMutex) Line 29 C++
UnrealEditor-AnimationData-Win64-Debug.dll!UAnimationSequencerDataModel::Evaluate(FAnimationPoseData & InOutPoseData, const UE::Anim::DataModel::FEvaluationContext & EvaluationContext) Line 781 C++
UnrealEditor-Engine-Win64-Debug.dll!UAnimSequence::GetBonePose(FAnimationPoseData & OutAnimationPoseData, const FAnimExtractContext & ExtractionContext, bool bForceUseRawData) Line 1840 C++
UnrealEditor-Engine-Win64-Debug.dll!UAnimSequence::GetAnimationPose(FAnimationPoseData & OutAnimationPoseData, const FAnimExtractContext & ExtractionContext) Line 1684 C++
UnrealEditor-AnimGraphRuntime-Win64-Debug.dll!FAnimNode_SequenceEvaluatorBase::Evaluate_AnyThread(FPoseContext & Output) Line 95 C++
UnrealEditor-Engine-Win64-Debug.dll!FPoseLink::Evaluate(FPoseContext & Output) Line 393 C++
UnrealEditor-AnimGraphRuntime-Win64-Debug.dll!FAnimNode_MirrorBase::Evaluate_AnyThread(FPoseContext & Output) Line 192 C++
UnrealEditor-Engine-Win64-Debug.dll!FPoseLink::Evaluate(FPoseContext & Output) Line 393 C++
UnrealEditor-AnimGraphRuntime-Win64-Debug.dll!FAnimNode_MultiWayBlend::Evaluate_AnyThread(FPoseContext & Output) Line 139 C++
UnrealEditor-Engine-Win64-Debug.dll!FPoseLink::Evaluate(FPoseContext & Output) Line 393 C++
UnrealEditor-AnimGraphRuntime-Win64-Debug.dll!FAnimNode_ApplyAdditive::Evaluate_AnyThread(FPoseContext & Output) Line 82 C++
UnrealEditor-AnimGraphRuntime-Win64-Debug.dll!FAnimSequencerInstanceProxy::Evaluate(FPoseContext & Output) Line 32 C++
UnrealEditor-Engine-Win64-Debug.dll!FAnimInstanceProxy::EvaluateInputProxy(FAnimInstanceProxy * InputProxy, FPoseContext & Output) Line 3742 C++
UnrealEditor-ControlRig-Win64-Debug.dll!FControlRigLayerInstanceProxy::EvaluateCustomProxy(FAnimInstanceProxy * InputProxy, FPoseContext & Output) Line 403 C++
UnrealEditor-ControlRig-Win64-Debug.dll!FAnimNode_ControlRigInputPose::Evaluate_AnyThread(FPoseContext & Output) Line 485 C++
UnrealEditor-Engine-Win64-Debug.dll!FPoseLink::Evaluate(FPoseContext & Output) Line 393 C++
UnrealEditor-ControlRig-Win64-Debug.dll!FAnimNode_ControlRigBase::Evaluate_AnyThread(FPoseContext & Output) Line 180 C++
UnrealEditor-ControlRig-Win64-Debug.dll!FControlRigLayerInstanceProxy::Evaluate(FPoseContext & Output) Line 103 C++
UnrealEditor-ControlRig-Win64-Debug.dll!FAnimInstanceProxy::Evaluate_WithRoot(FPoseContext & Output, FAnimNode_Base * InRootNode) Line 660 C++
UnrealEditor-Engine-Win64-Debug.dll!FAnimInstanceProxy::EvaluateAnimation_WithRoot(FPoseContext & Output, FAnimNode_Base * InRootNode) Line 1422 C++
UnrealEditor-Engine-Win64-Debug.dll!FAnimInstanceProxy::EvaluateAnimation(FPoseContext & Output) Line 1402 C++
UnrealEditor-Engine-Win64-Debug.dll!UAnimInstance::ParallelEvaluateAnimation(bool bForceRefPose, const USkeletalMesh * InSkeletalMesh, FParallelEvaluationData & OutEvaluationData) Line 908 C++
UnrealEditor-Engine-Win64-Debug.dll!USkeletalMeshComponent::EvaluateAnimation(const USkeletalMesh * InSkeletalMesh, UAnimInstance * InAnimInstance, bool bInForceRefPose, UE::Math::TVector<double> & OutRootBoneTranslation, FBlendedHeapCurve & OutCurve, FCompactPose & OutPose, UE::Anim::FHeapAttributeContainer & OutAttributes) Line 2369 C++
UnrealEditor-Engine-Win64-Debug.dll!USkeletalMeshComponent::PerformAnimationProcessing(const USkeletalMesh * InSkeletalMesh, UAnimInstance * InAnimInstance, bool bInDoEvaluation, bool bInForceRefPose, TArray<UE::Math::TTransform<double>,TSizedDefaultAllocator<32>> & OutSpaceBases, TArray<UE::Math::TTransform<double>,TSizedDefaultAllocator<32>> & OutBoneSpaceTransforms, UE::Math::TVector<double> & OutRootBoneTranslation, FBlendedHeapCurve & OutCurve, UE::Anim::FMeshAttributeContainer & OutAttributes) Line 2458 C++
UnrealEditor-Engine-Win64-Debug.dll!USkeletalMeshComponent::ParallelAnimationEvaluation() Line 4665 C++
UnrealEditor-Engine-Win64-Debug.dll!FParallelAnimationEvaluationTask::DoTask(ENamedThreads::Type CurrentThread, const TRefCountPtr<FBaseGraphTask> & MyCompletionGraphEvent) Line 367 C++
UnrealEditor-Engine-Win64-Debug.dll!TGraphTask<FParallelAnimationEvaluationTask>::ExecuteTask() Line 706 C++
UnrealEditor-Engine-Win64-Debug.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 527 C++
UnrealEditor-Engine-Win64-Debug.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init'::`2'::<lambda_1>>'::`19'::<lambda_1>,0>::CallAndMove(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> & Destination, void * InlineData, unsigned int DestInlineSize, bool <Params_0>) Line 171 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::CallAndMove<48>(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> & Destination, bool <Params_0>) Line 310 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FTask::ExecuteTask() Line 627 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FScheduler::ExecuteTask(LowLevelTasks::FTask * InTask) Line 365 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FScheduler::TryExecuteTaskFrom<LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue,&LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue::StealLocal,0>(LowLevelTasks::Private::FWaitEvent * WaitEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * Queue, LowLevelTasks::Private::FOutOfWork & OutOfWork, bool bPermitBackgroundWork) Line 665 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FScheduler::WorkerLoop(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 724 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FScheduler::WorkerMain(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 783 C++
UnrealEditor-Core-Win64-Debug.dll!LowLevelTasks::FScheduler::CreateWorker::__l2::<lambda>() Line 189 C++
[External Code]
UnrealEditor-Core-Win64-Debug.dll!FThreadImpl::Run() Line 68 C++
UnrealEditor-Core-Win64-Debug.dll!FRunnableThreadWin::Run() Line 156 C++
UnrealEditor-Core-Win64-Debug.dll!FRunnableThreadWin::GuardedRun() Line 71 C++
UnrealEditor-Core-Win64-Debug.dll!FRunnableThreadWin::_ThreadProc(void * pThis) Line 39 C++
[External Code]
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-352373 in the post.