Merge pull request #721 from ilmagico/fix-mingw-threads
Fix compilation of googletest with MinGW using Win32 threads
This commit is contained in:
commit
ed9d1e1ff9
@ -46,7 +46,9 @@ endmacro()
|
||||
# Google Mock. You can tweak these definitions to suit your need. A
|
||||
# variable's value is empty before it's explicitly assigned to.
|
||||
macro(config_compiler_and_linker)
|
||||
if (NOT gtest_disable_pthreads)
|
||||
# Note: pthreads on MinGW is not supported, even if available
|
||||
# instead, we use windows threading primitives
|
||||
if (NOT gtest_disable_pthreads AND NOT MINGW)
|
||||
# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
|
||||
find_package(Threads)
|
||||
endif()
|
||||
|
@ -396,10 +396,16 @@
|
||||
# include <io.h>
|
||||
# endif
|
||||
// In order to avoid having to include <windows.h>, use forward declaration
|
||||
// assuming CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
|
||||
#if GTEST_OS_WINDOWS_MINGW
|
||||
// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two
|
||||
// separate (equivalent) structs, instead of using typedef
|
||||
typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#else
|
||||
// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION.
|
||||
// This assumption is verified by
|
||||
// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION.
|
||||
struct _RTL_CRITICAL_SECTION;
|
||||
typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;
|
||||
#endif
|
||||
#else
|
||||
// This assumes that non-Windows OSes provide unistd.h. For OSes where this
|
||||
// is not the case, we need to include headers that provide the functions
|
||||
@ -1693,7 +1699,7 @@ class GTEST_API_ Mutex {
|
||||
// by the linker.
|
||||
MutexType type_;
|
||||
long critical_section_init_phase_; // NOLINT
|
||||
_RTL_CRITICAL_SECTION* critical_section_;
|
||||
GTEST_CRITICAL_SECTION* critical_section_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
|
||||
};
|
||||
|
@ -1295,9 +1295,16 @@ TEST(WindowsTypesTest, HANDLEIsVoidStar) {
|
||||
StaticAssertTypeEq<HANDLE, void*>();
|
||||
}
|
||||
|
||||
#if GTEST_OS_WINDOWS_MINGW
|
||||
TEST(WindowsTypesTest, _CRITICAL_SECTIONIs_CRITICAL_SECTION) {
|
||||
StaticAssertTypeEq<CRITICAL_SECTION, _CRITICAL_SECTION>();
|
||||
}
|
||||
#else
|
||||
TEST(WindowsTypesTest, CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION) {
|
||||
StaticAssertTypeEq<CRITICAL_SECTION, _RTL_CRITICAL_SECTION>();
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // GTEST_OS_WINDOWS
|
||||
|
||||
} // namespace internal
|
||||
|
@ -442,7 +442,7 @@ class FormatEpochTimeInMillisAsIso8601Test : public Test {
|
||||
// tzset() distinguishes between the TZ variable being present and empty
|
||||
// and not being present, so we have to consider the case of time_zone
|
||||
// being NULL.
|
||||
#if _MSC_VER
|
||||
#if _MSC_VER || GTEST_OS_WINDOWS_MINGW
|
||||
// ...Unless it's MSVC, whose standard library's _putenv doesn't
|
||||
// distinguish between an empty and a missing variable.
|
||||
const std::string env_var =
|
||||
|
Loading…
Reference in New Issue
Block a user