]> git.sesse.net Git - casparcg/commitdiff
Added a 2 second timeout for consumer sends, to detect and maybe recover from blocked...
authorHelge Norberg <helge.norberg@svt.se>
Thu, 23 Oct 2014 09:08:47 +0000 (11:08 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Thu, 23 Oct 2014 09:08:47 +0000 (11:08 +0200)
core/consumer/output.cpp

index 86c27cd219e8525247ddd244f3ee85d7d3ab2f5f..9e2b05e61dd979195a40b236c6bb99df375dd8ff 100644 (file)
@@ -254,27 +254,39 @@ public:
                                                \r
                                        try\r
                                        {\r
-                                               if(!result_future.get())\r
+                                               if (!result_future.timed_wait(boost::posix_time::seconds(2)))\r
+                                               {\r
+                                                       BOOST_THROW_EXCEPTION(timed_out() << msg_info(narrow(print()) + " " + narrow(consumer->print()) + " Timed out during send"));\r
+                                               }\r
+\r
+                                               if (!result_future.get())\r
                                                {\r
                                                        CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Removed.";\r
                                                        send_to_consumers_delays_.erase(result_it->first);\r
                                                        consumers_.erase(result_it->first);\r
                                                }\r
                                        }\r
-                                       catch(...)\r
+                                       catch (...)\r
                                        {\r
                                                CASPAR_LOG_CURRENT_EXCEPTION();\r
                                                try\r
                                                {\r
                                                        consumer->initialize(format_desc_, audio_channel_layout_, channel_index_);\r
-                                                       if(!consumer->send(frame).get())\r
+                                                       auto retry_future = consumer->send(frame);\r
+\r
+                                                       if (!retry_future.timed_wait(boost::posix_time::seconds(2)))\r
+                                                       {\r
+                                                               BOOST_THROW_EXCEPTION(timed_out() << msg_info(narrow(print()) + " " + narrow(consumer->print()) + " Timed out during retry"));\r
+                                                       }\r
+\r
+                                                       if (!retry_future.get())\r
                                                        {\r
                                                                CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Removed.";\r
                                                                send_to_consumers_delays_.erase(result_it->first);\r
                                                                consumers_.erase(result_it->first);\r
                                                        }\r
                                                }\r
-                                               catch(...)\r
+                                               catch (...)\r
                                                {\r
                                                        CASPAR_LOG_CURRENT_EXCEPTION();\r
                                                        CASPAR_LOG(error) << "Failed to recover consumer: " << consumer->print() << L". Removing it.";\r