@ -32,6 +32,17 @@
# include <mutex>
# ifdef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
# include <windows.h>
// GetMessage conflicts with GeneratedMessageReflection::GetMessage().
# ifdef GetMessage
# undef GetMessage
# endif
# endif
# include <google/protobuf/stubs/macros.h>
// Define thread-safety annotations for use below, if we are building with
@ -56,6 +67,27 @@ namespace internal {
# define GOOGLE_PROTOBUF_LINKER_INITIALIZED
# ifdef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
// This class is a lightweight replacement for std::mutex on Windows platforms.
// std::mutex does not work on Windows XP SP2 with the latest VC++ libraries,
// because it utilizes the Concurrency Runtime that is only supported on Windows
// XP SP3 and above.
class PROTOBUF_EXPORT CriticalSectionLock {
public :
CriticalSectionLock ( ) { InitializeCriticalSection ( & critical_section_ ) ; }
~ CriticalSectionLock ( ) { DeleteCriticalSection ( & critical_section_ ) ; }
void lock ( ) { EnterCriticalSection ( & critical_section_ ) ; }
void unlock ( ) { LeaveCriticalSection ( & critical_section_ ) ; }
private :
CRITICAL_SECTION critical_section_ ;
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS ( CriticalSectionLock ) ;
} ;
# endif
// Mutex is a natural type to wrap. As both google and other organization have
// specialized mutexes. gRPC also provides an injection mechanism for custom
// mutexes.
@ -69,7 +101,11 @@ class PROTOBUF_EXPORT WrappedMutex {
void AssertHeld ( ) const { }
private :
# ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
std : : mutex mu_ ;
# else // ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
CriticalSectionLock mu_ ;
# endif // #ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
} ;
using Mutex = WrappedMutex ;