Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2020-03-23 11:55:15 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-03-23 11:55:15 +0300
commitbceb91ffd23c3bc09cce935a4f6d72f91392dc77 (patch)
tree243c8d1626e9ba29f11ecfa51cc17aa02452dfe6
parent0710fb724beb38cf76e0e9bce2c2b310027bef29 (diff)
Sound: Fix asymmetrical mutex lock/unlock logic
Started to happen after recent fix for T72632. Was caused by runtime fields backup doing an early exit in the case the given ID was never expanded by the Copy-on-Write mechanism, but it was not done int the backup restore function (since it was not possible to know "locally"). Now both init() and restore() will do an early exit when the ID had nothing to be backed up.
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc8
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h11
2 files changed, 18 insertions, 1 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc
index 108f5f04879..e141925725b 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.cc
@@ -32,7 +32,8 @@
namespace DEG {
RuntimeBackup::RuntimeBackup(const Depsgraph *depsgraph)
- : animation_backup(depsgraph),
+ : have_backup(nullptr),
+ animation_backup(depsgraph),
scene_backup(depsgraph),
sound_backup(depsgraph),
object_backup(depsgraph),
@@ -48,6 +49,7 @@ void RuntimeBackup::init_from_id(ID *id)
if (!deg_copy_on_write_is_expanded(id)) {
return;
}
+ have_backup = true;
animation_backup.init_from_id(id);
@@ -83,6 +85,10 @@ void RuntimeBackup::init_from_id(ID *id)
void RuntimeBackup::restore_to_id(ID *id)
{
+ if (!have_backup) {
+ return;
+ }
+
animation_backup.restore_to_id(id);
const ID_Type id_type = GS(id->name);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h
index c818c1f7064..d1a30652b36 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup.h
@@ -46,6 +46,17 @@ class RuntimeBackup {
/* Restore fields to the given ID. */
void restore_to_id(ID *id);
+ /* Denotes whether init_from_id did put anything into the backup storage.
+ * This will not be the case when init_from_id() is called for an ID which has never been
+ * copied-on-write. In this case there is no need to backup or restore anything.
+ *
+ * It also allows to have restore() logic to be symmetrical to init() without need to worry
+ * that init() might not have happenned.
+ *
+ * In practice this is used by audio system to lock audio while scene is going through
+ * copy-on-write mechanism. */
+ bool have_backup;
+
AnimationBackup animation_backup;
SceneBackup scene_backup;
SoundBackup sound_backup;