ocl: process termination hung workaround
authorAlexander Alekhin <alexander.alekhin@itseez.com>
Tue, 10 Dec 2013 20:31:34 +0000 (00:31 +0400)
committerAlexander Alekhin <alexander.alekhin@itseez.com>
Tue, 10 Dec 2013 20:31:34 +0000 (00:31 +0400)
modules/core/src/ocl.cpp
modules/core/src/precomp.hpp
modules/core/src/system.cpp

index 0cff7b5..96a006f 100644 (file)
@@ -1932,10 +1932,15 @@ struct Queue::Impl
 
     ~Impl()
     {
-        if(handle)
+#ifdef _WIN32
+        if (!cv::__termination)
+#endif
         {
-            clFinish(handle);
-            clReleaseCommandQueue(handle);
+            if(handle)
+            {
+                clFinish(handle);
+                clReleaseCommandQueue(handle);
+            }
         }
     }
 
index 7465685..87104af 100644 (file)
@@ -249,6 +249,9 @@ namespace ocl
     MatAllocator* getOpenCLAllocator();
 }
 
+extern bool __termination; // skip some cleanups, because process is terminating
+                           // (for example, if ExitProcess() was already called)
+
 }
 
 #endif /*_CXCORE_INTERNAL_H_*/
index eee06e2..2786597 100644 (file)
@@ -734,18 +734,23 @@ cvErrorFromIppStatus( int status )
     }
 }
 
+namespace cv {
+bool __termination = false;
+}
 
 #if defined CVAPI_EXPORTS && defined WIN32 && !defined WINCE
 #ifdef HAVE_WINRT
     #pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
 #endif
 
-BOOL WINAPI DllMain( HINSTANCE, DWORD  fdwReason, LPVOID );
+BOOL WINAPI DllMain( HINSTANCE, DWORD, LPVOID );
 
-BOOL WINAPI DllMain( HINSTANCE, DWORD  fdwReason, LPVOID )
+BOOL WINAPI DllMain( HINSTANCE, DWORD fdwReason, LPVOID lpReserved )
 {
     if( fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH )
     {
+        if (lpReserved != NULL) // called after ExitProcess() call
+            cv::__termination = true;
         cv::deleteThreadAllocData();
         cv::deleteThreadData();
     }