提交 ced81b91 编写于 作者: A Andrey Pavlenko 提交者: OpenCV Buildbot

Merge pull request #2594 from arkunze:pullreq/140319-dll-shutdown-fix-b

...@@ -1581,7 +1581,7 @@ void finish() ...@@ -1581,7 +1581,7 @@ void finish()
#define IMPLEMENT_REFCOUNTABLE() \ #define IMPLEMENT_REFCOUNTABLE() \
void addref() { CV_XADD(&refcount, 1); } \ 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 int refcount
/////////////////////////////////////////// Platform ///////////////////////////////////////////// /////////////////////////////////////////// Platform /////////////////////////////////////////////
......
...@@ -918,16 +918,22 @@ public: ...@@ -918,16 +918,22 @@ public:
#pragma warning(disable:4447) // Disable warning 'main' signature found without threading model #pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
#endif #endif
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID); extern "C"
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved) BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved)
{ {
if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH) if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH)
{ {
if (lpReserved != NULL) // called after ExitProcess() call if (lpReserved != NULL) // called after ExitProcess() call
{
cv::__termination = true; 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; return TRUE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册