]> git.sesse.net Git - casparcg/blobdiff - common/concurrency/executor.h
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / common / concurrency / executor.h
index 2caf5c705f65e2c8c18a6dae82da5b7aa770c5b8..ad86d4a379358f11083f56df523ba66b7f703e45 100644 (file)
@@ -20,7 +20,8 @@
 #pragma once\r
 \r
 #include "../exception/win32_exception.h"\r
-#include "../utility/assert.h"\r
+#include "../utility/string.h"\r
+#include "../utility/move_on_copy.h"\r
 #include "../log/log.h"\r
 \r
 #include <tbb/atomic.h>\r
@@ -61,14 +62,14 @@ inline void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
 \r
 }\r
 \r
-enum priority\r
+enum task_priority\r
 {\r
        high_priority,\r
        normal_priority,\r
        priority_count\r
 };\r
 \r
-enum priority_class\r
+enum thread_priority\r
 {\r
        high_priority_class,\r
        above_normal_priority_class,\r
@@ -76,23 +77,6 @@ enum priority_class
        below_normal_priority_class\r
 };\r
 \r
-namespace internal\r
-{\r
-       template<typename T>\r
-       struct move_on_copy\r
-       {\r
-               move_on_copy(const move_on_copy<T>& other) : value(std::move(other.value)){}\r
-               move_on_copy(T&& value) : value(std::move(value)){}\r
-               mutable T value;\r
-       };\r
-\r
-       template<typename T>\r
-       move_on_copy<T> make_move_on_copy(T&& value)\r
-       {\r
-               return move_on_copy<T>(std::move(value));\r
-       }\r
-}\r
-\r
 class executor : boost::noncopyable\r
 {\r
        const std::string name_;\r
@@ -141,7 +125,7 @@ public:
                execution_queue_[normal_priority].set_capacity(capacity);\r
        }\r
 \r
-       void set_priority_class(priority_class p)\r
+       void set_priority_class(thread_priority p)\r
        {\r
                begin_invoke([=]\r
                {\r
@@ -174,10 +158,10 @@ public:
        }\r
                                \r
        template<typename Func>\r
-       auto begin_invoke(Func&& func, priority priority = normal_priority) -> boost::unique_future<decltype(func())> // noexcept\r
+       auto begin_invoke(Func&& func, task_priority priority = normal_priority) -> boost::unique_future<decltype(func())> // noexcept\r
        {       \r
                // Create a move on copy adaptor to avoid copying the functor into the queue, tbb::concurrent_queue does not support move semantics.\r
-               auto task_adaptor = internal::make_move_on_copy(create_task(func));\r
+               auto task_adaptor = make_move_on_copy(create_task(func));\r
 \r
                auto future = task_adaptor.value.get_future();\r
 \r
@@ -195,10 +179,10 @@ public:
        }\r
 \r
        template<typename Func>\r
-       auto try_begin_invoke(Func&& func, priority priority = normal_priority) -> boost::unique_future<decltype(func())> // noexcept\r
+       auto try_begin_invoke(Func&& func, task_priority priority = normal_priority) -> boost::unique_future<decltype(func())> // noexcept\r
        {\r
                // Create a move on copy adaptor to avoid copying the functor into the queue, tbb::concurrent_queue does not support move semantics.\r
-               auto task_adaptor = internal::make_move_on_copy(create_task(func));\r
+               auto task_adaptor = make_move_on_copy(create_task(func));\r
                \r
                auto future = task_adaptor.value.get_future();\r
 \r
@@ -208,11 +192,7 @@ public:
                        {\r
                                try{task_adaptor.value();}\r
                                catch(boost::task_already_started&){}\r
-                               catch(...)\r
-                               {\r
-                                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-                                       throw;\r
-                               }\r
+                               catch(...){CASPAR_LOG_CURRENT_EXCEPTION();}\r
                        });\r
                }\r
                \r
@@ -220,7 +200,7 @@ public:
        }\r
 \r
        template<typename Func>\r
-       auto invoke(Func&& func, priority prioriy = normal_priority) -> decltype(func()) // noexcept\r
+       auto invoke(Func&& func, task_priority prioriy = normal_priority) -> decltype(func()) // noexcept\r
        {\r
                if(boost::this_thread::get_id() == thread_.get_id())  // Avoids potential deadlock.\r
                        return func();\r
@@ -229,7 +209,7 @@ public:
        }\r
 \r
        template<typename Func>\r
-       auto try_invoke(Func&& func, priority prioriy = normal_priority) -> decltype(func()) // noexcept\r
+       auto try_invoke(Func&& func, task_priority prioriy = normal_priority) -> decltype(func()) // noexcept\r
        {\r
                if(boost::this_thread::get_id() == thread_.get_id())  // Avoids potential deadlock.\r
                        return func();\r
@@ -273,7 +253,16 @@ private:
                win32_exception::install_handler();             \r
                detail::SetThreadName(GetCurrentThreadId(), name_.c_str());\r
                while(is_running_)\r
-                       execute();\r
+               {\r
+                       try\r
+                       {\r
+                               execute();\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       }\r
+               }\r
        }       \r
 };\r
 \r