]> git.sesse.net Git - casparcg/commitdiff
2.1.0: -async: Don't lock unnecessarily while invoking "launch::async" functor.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Feb 2012 14:04:01 +0000 (14:04 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Feb 2012 14:04:01 +0000 (14:04 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@2472 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/future.h

index c4b88b75df81c52f92bc74fb860457c842a06506..7ee9da4fd31b8e2ce6fde8e560f2a67cb078f33f 100644 (file)
@@ -26,7 +26,7 @@ template<typename R>
 struct future_object_helper\r
 {      \r
        template<typename T, typename F>\r
-       static void invoke(T& future_object, F& f)\r
+       static void nonlocking_invoke(T& future_object, F& f)\r
        {                               \r
         try\r
         {\r
@@ -37,13 +37,26 @@ struct future_object_helper
                        future_object.mark_exceptional_finish_internal(boost::current_exception());\r
         }\r
        }\r
+\r
+       template<typename T, typename F>\r
+       static void locking_invoke(T& future_object, F& f)\r
+       {                               \r
+        try\r
+        {\r
+                       future_object.mark_finished_with_result(f());\r
+        }\r
+        catch(...)\r
+        {\r
+                       future_object.mark_exceptional_finish();\r
+        }\r
+       }\r
 };\r
 \r
 template<>\r
 struct future_object_helper<void>\r
 {      \r
        template<typename T, typename F>\r
-       static void invoke(T& future_object, F& f)\r
+       static void nonlocking_invoke(T& future_object, F& f)\r
        {                               \r
         try\r
         {\r
@@ -55,6 +68,20 @@ struct future_object_helper<void>
                        future_object.mark_exceptional_finish_internal(boost::current_exception());\r
         }\r
        }\r
+\r
+       template<typename T, typename F>\r
+       static void locking_invoke(T& future_object, F& f)\r
+       {                               \r
+        try\r
+        {\r
+                       f();\r
+                       future_object.mark_finished_with_result();\r
+        }\r
+        catch(...)\r
+        {\r
+                       future_object.mark_exceptional_finish();\r
+        }\r
+       }\r
 };\r
 \r
 template<typename R, typename F>\r
@@ -78,7 +105,7 @@ struct deferred_future_object : public boost::detail::future_object<R>
                if(done)\r
                        return;\r
 \r
-               future_object_helper<R>::invoke(*this, f);\r
+               future_object_helper<R>::nonlocking_invoke(*this, f);\r
 \r
                done = true;\r
        }\r
@@ -104,9 +131,7 @@ struct async_future_object : public boost::detail::future_object<R>
 \r
        void run()\r
        {\r
-               boost::lock_guard<boost::mutex> lock2(mutex);           \r
-\r
-               future_object_helper<R>::invoke(*this, f);\r
+               future_object_helper<R>::locking_invoke(*this, f);\r
        }\r
 };\r
 \r