Skip to content

Commit

Permalink
Merge pull request opencv#12791 from alalek:win32_dllmain_detect_term…
Browse files Browse the repository at this point in the history
…ination
  • Loading branch information
alalek committed Oct 11, 2018
2 parents 53785b6 + 11e2a21 commit be76b45
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
8 changes: 8 additions & 0 deletions cmake/OpenCVModule.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,13 @@ macro(_ocv_create_module)
source_group("Src" FILES "${_VS_VERSION_FILE}")
endif()
endif()
if(WIN32 AND NOT ("${the_module}" STREQUAL "opencv_core" OR "${the_module}" STREQUAL "opencv_world")
AND (BUILD_SHARED_LIBS AND NOT "x${OPENCV_MODULE_TYPE}" STREQUAL "xSTATIC")
AND NOT OPENCV_SKIP_DLLMAIN_GENERATION
)
set(_DLLMAIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/${the_module}_main.cpp")
configure_file("${OpenCV_SOURCE_DIR}/cmake/templates/dllmain.cpp.in" "${_DLLMAIN_FILE}" @ONLY)
endif()

source_group("Include" FILES "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv2/opencv_modules.hpp")
source_group("Src" FILES "${${the_module}_pch}")
Expand All @@ -918,6 +925,7 @@ macro(_ocv_create_module)
"${OPENCV_CONFIG_FILE_INCLUDE_DIR}/cvconfig.h" "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv2/opencv_modules.hpp"
${${the_module}_pch}
${_VS_VERSION_FILE}
${_DLLMAIN_FILE}
)
set_target_properties(${the_module} PROPERTIES LABELS "${OPENCV_MODULE_${the_module}_LABEL};Module")
set_source_files_properties(${OPENCV_MODULE_${the_module}_HEADERS} ${OPENCV_MODULE_${the_module}_SOURCES} ${${the_module}_pch}
Expand Down
36 changes: 36 additions & 0 deletions cmake/templates/dllmain.cpp.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.

#ifndef _WIN32
#error "Build configuration error"
#endif
#ifndef CVAPI_EXPORTS
#error "Build configuration error"
#endif

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#define OPENCV_MODULE_S "@the_module@"

namespace cv {
extern __declspec(dllimport) bool __termination; // Details: #12750
}

extern "C"
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved);

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
{
//printf("OpenCV: terminating: " OPENCV_MODULE_S "\n");
cv::__termination = true;
}
}
return TRUE;
}
4 changes: 4 additions & 0 deletions modules/core/src/ocl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4779,6 +4779,10 @@ class OpenCLAllocator CV_FINAL : public MatAllocator

void deallocate_(UMatData* u) const
{
#ifdef _WIN32
if (cv::__termination) // process is not in consistent state (after ExitProcess call) and terminating
return; // avoid any OpenCL calls
#endif
if(u->tempUMat())
{
CV_Assert(u->origdata);
Expand Down
5 changes: 3 additions & 2 deletions modules/core/src/precomp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -308,8 +308,9 @@ TLSData<CoreTLSData>& getCoreTlsData();
#define CL_RUNTIME_EXPORT
#endif

extern bool __termination; // skip some cleanups, because process is terminating
// (for example, if ExitProcess() was already called)
extern CV_EXPORTS
bool __termination; // skip some cleanups, because process is terminating
// (for example, if ExitProcess() was already called)

cv::Mutex& getInitializationMutex();

Expand Down

0 comments on commit be76b45

Please sign in to comment.