]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 2 Nov 2011 18:35:24 +0000 (18:35 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 2 Nov 2011 18:35:24 +0000 (18:35 +0000)
common/concurrency/governor.h
core/consumer/output.cpp

index ffeddc093906be15e34670272abf7986a82899da..e8b495849b818703d5805fac98de26af2996b094 100644 (file)
@@ -3,7 +3,8 @@
 #include "../memory/safe_ptr.h"\r
 \r
 #include <concrt.h>\r
-#include <concurrent_queue.h>\r
+#include <queue>\r
+\r
 #include <tbb/atomic.h>\r
 \r
 #include <boost/noncopyable.hpp>\r
@@ -20,10 +21,11 @@ class governor : boost::noncopyable
 {\r
        struct impl : std::enable_shared_from_this<impl>\r
        {\r
-               tbb::atomic<int> count_;\r
-               tbb::atomic<int> is_running_;\r
-               Concurrency::concurrent_queue<Concurrency::Context*> waiting_contexts_;\r
-\r
+               tbb::atomic<int>                                        count_;\r
+               tbb::atomic<int>                                        is_running_;\r
+               std::queue<Concurrency::Context*>       waiting_contexts_;\r
+               Concurrency::critical_section           mutex_;\r
+               \r
                void acquire_ticket()\r
                {\r
                        if(!is_running_)\r
@@ -32,12 +34,20 @@ class governor : boost::noncopyable
                        if(count_ < 1)\r
                                Concurrency::Context::Yield();\r
 \r
-                       if (--count_ < 0)\r
+                       Concurrency::Context* context = nullptr;\r
+\r
                        {\r
-                               auto context = Concurrency::Context::CurrentContext();\r
-                               waiting_contexts_.push(context);\r
-                               context->Block();\r
+                               Concurrency::critical_section::scoped_lock lock(mutex_);\r
+\r
+                               if (--count_ < 0)\r
+                               {\r
+                                       context = Concurrency::Context::CurrentContext();\r
+                                       waiting_contexts_.push(context);\r
+                               }\r
                        }\r
+\r
+                       if(context)\r
+                               context->Block();\r
                }\r
                \r
                bool try_acquire_ticket()\r
@@ -46,13 +56,18 @@ class governor : boost::noncopyable
                                return false;\r
 \r
                        if(count_ < 1)\r
-                               Concurrency::Context::Yield();\r
+                               return false;\r
 \r
-                       if (--count_ < 0)\r
                        {\r
-                               ++count_;\r
-                               return false;\r
+                               Concurrency::critical_section::scoped_lock lock(mutex_);\r
+                                               \r
+                               if (--count_ < 0)\r
+                               {\r
+                                       ++count_;\r
+                                       return false;\r
+                               }\r
                        }\r
+\r
                        return true;\r
                }\r
 \r
@@ -60,13 +75,15 @@ class governor : boost::noncopyable
                {\r
                        if(!is_running_)\r
                                return;\r
-\r
-                       if(++count_ <= 0)\r
+                       \r
                        {\r
-                               Concurrency:: Context* waiting = NULL;\r
-                               while(!waiting_contexts_.try_pop(waiting))\r
-                                       Concurrency::Context::Yield();\r
-                               waiting->Unblock();\r
+                               Concurrency::critical_section::scoped_lock lock(mutex_);\r
+\r
+                               if(++count_ <= 0)\r
+                               {\r
+                                       waiting_contexts_.front()->Unblock();\r
+                                       waiting_contexts_.pop();\r
+                               }\r
                        }\r
                }\r
 \r
@@ -75,7 +92,7 @@ class governor : boost::noncopyable
                impl(size_t capacity) \r
                {\r
                        is_running_ = true;\r
-                       count_ = capacity;\r
+                       count_          = capacity;\r
                }\r
        \r
                ticket_t acquire()\r
@@ -90,14 +107,14 @@ class governor : boost::noncopyable
                        }));\r
                        return ticket;\r
                }\r
-               \r
+                \r
                bool try_acquire(ticket_t& ticket)\r
                {\r
                        if(!try_acquire_ticket())\r
                                return false;\r
                \r
                        auto self = shared_from_this();\r
-                       ticket.push_back(std::shared_ptr<void>(nullptr, [=](void*)\r
+                       ticket.push_back(std::shared_ptr<void>(nullptr, [self](void*)\r
                        {\r
                                self->release_ticket();\r
                        }));\r
@@ -108,9 +125,16 @@ class governor : boost::noncopyable
                void cancel()\r
                {\r
                        is_running_ = false;\r
-                       Concurrency::Context* waiting = NULL;\r
-                       while(waiting_contexts_.try_pop(waiting))\r
-                               waiting->Unblock();\r
+                       \r
+                       {\r
+                               Concurrency::critical_section::scoped_lock lock(mutex_);\r
+                       \r
+                               while(!waiting_contexts_.empty())\r
+                               {\r
+                                       waiting_contexts_.front()->Unblock();\r
+                                       waiting_contexts_.pop();\r
+                               }\r
+                       }\r
                }\r
        };\r
 \r
index b245c0b90822d40ca01a1480df862852f345ca61..6822b1ad4410676224b2b53aaab970b9b3fb19dc 100644 (file)
@@ -113,7 +113,7 @@ public:
        {       \r
                const auto frame = element.first;\r
 \r
-               if(frame->image_data().size() != format_desc_.size)\r
+               if(frame->image_data().size() != static_cast<int>(format_desc_.size))\r
                        return;\r
 \r
                {\r