]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Run ogl GC on bad_alloc.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 7 Jun 2011 12:06:22 +0000 (12:06 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 7 Jun 2011 12:06:22 +0000 (12:06 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@852 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/gpu/ogl_device.cpp
core/mixer/gpu/ogl_device.h
modules/decklink/interop/DeckLinkAPI_h.h

index 2431d1dabea826e0137998e6c42b4dd94d4f645d..c017675cdffacb7a8c40cca88b223eba943b7997 100644 (file)
@@ -72,8 +72,19 @@ safe_ptr<device_buffer> ogl_device::create_device_buffer(size_t width, size_t he
                        }\r
                        catch(...)\r
                        {\r
-                               BOOST_THROW_EXCEPTION(bad_alloc()\r
-                                       << errinfo_nested_exception(std::current_exception()));\r
+                               CASPAR_LOG(info) << "ogl: bad_alloc, retrying.";\r
+                               gc().wait();\r
+                                                       \r
+                               try\r
+                               {\r
+                                       buffer = std::make_shared<device_buffer>(width, height, stride);\r
+                               }\r
+                               catch(...)\r
+                               {\r
+                                       BOOST_THROW_EXCEPTION(bad_alloc()\r
+                                               << errinfo_nested_exception(std::current_exception()));\r
+                               }\r
+\r
                        }\r
                }, high_priority);      \r
        }\r
@@ -101,8 +112,22 @@ safe_ptr<host_buffer> ogl_device::create_host_buffer(size_t size, host_buffer::u
                        }\r
                        catch(...)\r
                        {\r
-                               BOOST_THROW_EXCEPTION(bad_alloc()\r
-                                       << errinfo_nested_exception(std::current_exception()));\r
+                               CASPAR_LOG(info) << "ogl: bad_alloc, retrying.";\r
+                               gc().wait();\r
+\r
+                               try\r
+                               {\r
+                                       buffer = std::make_shared<host_buffer>(size, usage);\r
+                                       if(usage == host_buffer::write_only)\r
+                                               buffer->map();\r
+                                       else\r
+                                               buffer->unmap();        \r
+                               }\r
+                               catch(...)\r
+                               {\r
+                                       BOOST_THROW_EXCEPTION(bad_alloc()\r
+                                               << errinfo_nested_exception(std::current_exception()));\r
+                               }\r
                        }\r
 \r
                }, high_priority);      \r
@@ -128,15 +153,17 @@ void ogl_device::yield()
        executor_.yield();\r
 }\r
 \r
-void ogl_device::gc()\r
+boost::unique_future<void> ogl_device::gc()\r
 {\r
-       //begin_invoke([=]\r
-       //{             \r
-       //      BOOST_FOREACH(auto& pool, device_pools_)\r
-       //              pool.clear();\r
-       //      BOOST_FOREACH(auto& pool, host_pools_)\r
-       //              pool.clear();\r
-       //});\r
+       CASPAR_LOG(info) << " ogl: Running GC.";\r
+\r
+       return begin_invoke([=]\r
+       {               \r
+               BOOST_FOREACH(auto& pool, device_pools_)\r
+                       pool.clear();\r
+               BOOST_FOREACH(auto& pool, host_pools_)\r
+                       pool.clear();\r
+       });\r
 }\r
 \r
 std::wstring ogl_device::get_version()\r
index 01556f803e664a67c91a0a2eb583bf2148075ba2..bd912a878e20d2f3bf017c0c3ca5ef833b8a9a7c 100644 (file)
@@ -67,7 +67,7 @@ public:
        safe_ptr<device_buffer> create_device_buffer(size_t width, size_t height, size_t stride);\r
        safe_ptr<host_buffer> create_host_buffer(size_t size, host_buffer::usage_t usage);\r
        void yield();\r
-       void gc();\r
+       boost::unique_future<void> gc();\r
 \r
        static std::wstring get_version();\r
 };\r
index b89307228e3e13f80a5a3eda3cc068690308cbc7..1c879913d71169153fcfa3779c826aa98d58762c 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Mon Jun 06 18:19:11 2011\r
+/* at Tue Jun 07 11:22:46 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r