]> git.sesse.net Git - casparcg/commitdiff
stage: Fixed dead-lock that can occur with multiple mixer tweens.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 21 Nov 2012 19:25:08 +0000 (19:25 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 21 Nov 2012 19:25:08 +0000 (19:25 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@3548 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/producer/stage.cpp

index a2d5523e31d1452c901ce37a2e71aa11879e2c15..3422cf4c2bfcc109f3c92c446c2ec2a56f550644 100644 (file)
@@ -36,6 +36,7 @@
 #include <boost/timer.hpp>\r
 \r
 #include <tbb/parallel_for_each.h>\r
+#include <tbb/concurrent_unordered_map.h>\r
 \r
 #include <boost/property_tree/ptree.hpp>\r
 \r
@@ -88,15 +89,15 @@ public:
 struct stage::implementation : public std::enable_shared_from_this<implementation>\r
                                                         , boost::noncopyable\r
 {              \r
-       safe_ptr<diagnostics::graph>    graph_;\r
-       safe_ptr<stage::target_t>               target_;\r
-       video_format_desc                               format_desc_;\r
-\r
-       boost::timer                                    produce_timer_;\r
-       boost::timer                                    tick_timer_;\r
-\r
-       std::map<int, layer>                    layers_;        \r
-       std::map<int, tweened_transform<core::frame_transform>> transforms_;    \r
+       safe_ptr<diagnostics::graph>                                                                                             graph_;\r
+       safe_ptr<stage::target_t>                                                                                                        target_;\r
+       video_format_desc                                                                                                                        format_desc_;\r
+                                                                                                                                                                \r
+       boost::timer                                                                                                                             produce_timer_;\r
+       boost::timer                                                                                                                             tick_timer_;\r
+                                                                                                                                                                \r
+       std::map<int, layer>                                                                                                             layers_;       \r
+       tbb::concurrent_unordered_map<int, tweened_transform<core::frame_transform>> transforms_;       \r
 \r
        executor                                                executor_;\r
 public:\r
@@ -215,7 +216,7 @@ public:
        {\r
                executor_.begin_invoke([=]\r
                {\r
-                       transforms_.erase(index);\r
+                       transforms_[index] = tweened_transform<core::frame_transform>();\r
                }, high_priority);\r
        }\r
 \r