ocl: process termination hung workaround

pull/1972/head
Alexander Alekhin 11 years ago
parent d802b4d143
commit bdbd3eb2bf
  1. 11
      modules/core/src/ocl.cpp
  2. 3
      modules/core/src/precomp.hpp
  3. 9
      modules/core/src/system.cpp

@ -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);
}
}
}

@ -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_*/

@ -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();
}

Loading…
Cancel
Save