From 629ddf0bf8a8d036fa60290a83a5d4f07522b428 Mon Sep 17 00:00:00 2001 From: Aaron Kunze Date: Mon, 24 Mar 2014 13:38:57 -0700 Subject: [PATCH] Resolves bug #3450 (Improperly cleaning up resources in DllMain) --- modules/core/src/ocl.cpp | 2 +- modules/core/src/system.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index ffea804..24190c5 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1581,7 +1581,7 @@ void finish() #define IMPLEMENT_REFCOUNTABLE() \ void addref() { CV_XADD(&refcount, 1); } \ - void release() { if( CV_XADD(&refcount, -1) == 1 ) delete this; } \ + void release() { if( CV_XADD(&refcount, -1) == 1 && !cv::__termination) delete this; } \ int refcount /////////////////////////////////////////// Platform ///////////////////////////////////////////// diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index 4b3efce..cef4db3 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -918,16 +918,22 @@ public: #pragma warning(disable:4447) // Disable warning 'main' signature found without threading model #endif -BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID); - +extern "C" 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(); + } + else + { + // Not allowed to free resources if lpReserved is non-null + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx + cv::deleteThreadAllocData(); + cv::deleteThreadData(); + } } return TRUE; } -- 2.7.4