From c9806436494fb4a31a096e92effb9c92a81447b4 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 28 Nov 2021 16:21:59 +0100 Subject: [PATCH] chan: Lock PartBundle while binding animation This seems like the right thing to do that could prevent some potential race conditions; let me known if this is breaking anything. --- panda/src/chan/partBundle.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/panda/src/chan/partBundle.cxx b/panda/src/chan/partBundle.cxx index ddd31898ee..2cd6eca594 100644 --- a/panda/src/chan/partBundle.cxx +++ b/panda/src/chan/partBundle.cxx @@ -599,6 +599,10 @@ do_bind_anim(AnimControl *control, AnimBundle *anim, return false; } + // Grabbing the lock early prevents any other thread in stage 0 from also + // trying to modify the channel list at the same time. + CDLockedReader cdata(_cycler); + plist holes; int channel_index = 0; pick_channel_index(holes, channel_index); @@ -616,7 +620,6 @@ do_bind_anim(AnimControl *control, AnimBundle *anim, subset.is_include_empty(), bound_joints, subset); control->setup_anim(this, anim, channel_index, bound_joints); - CDReader cdata(_cycler); determine_effective_channels(cdata); return true;