From 4cf1b6068fa6989edb162e8a7ea82512d2821f1f Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Sat, 17 Jan 2015 20:38:13 +0100 Subject: [PATCH] common: fix windows build (hopefully) * Use threading wrapper for Mutex.cpp/wxHelpers.cpp * Cast s32 to long on window (not tested on windows ;) ping me if it still doesn't work) --- common/src/Utilities/Mutex.cpp | 4 ++-- common/src/Utilities/ThreadTools.cpp | 28 ++++++++++++++++++---------- common/src/Utilities/wxHelpers.cpp | 2 +- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/common/src/Utilities/Mutex.cpp b/common/src/Utilities/Mutex.cpp index abdae8eea7..2462ac4a05 100644 --- a/common/src/Utilities/Mutex.cpp +++ b/common/src/Utilities/Mutex.cpp @@ -69,7 +69,7 @@ Threading::Mutex::~Mutex() throw() Threading::MutexRecursive::MutexRecursive() : Mutex( false ) { - if( _InterlockedIncrement( &_attr_refcount ) == 1 ) + if( Threading::AtomicIncrement( _attr_refcount ) == 1 ) { if( 0 != pthread_mutexattr_init( &_attr_recursive ) ) throw Exception::OutOfMemory(L"Recursive mutexing attributes"); @@ -83,7 +83,7 @@ Threading::MutexRecursive::MutexRecursive() : Mutex( false ) Threading::MutexRecursive::~MutexRecursive() throw() { - if( _InterlockedDecrement( &_attr_refcount ) == 0 ) + if( Threading::AtomicDecrement( _attr_refcount ) == 0 ) pthread_mutexattr_destroy( &_attr_recursive ); } diff --git a/common/src/Utilities/ThreadTools.cpp b/common/src/Utilities/ThreadTools.cpp index bd679d0276..0cb6f05821 100644 --- a/common/src/Utilities/ThreadTools.cpp +++ b/common/src/Utilities/ThreadTools.cpp @@ -789,6 +789,14 @@ void Threading::WaitEvent::Wait() // Note: For all of these atomic operations below to be atomic, the variables need to be 4-byte // aligned. Read: http://msdn.microsoft.com/en-us/library/ms684122%28v=vs.85%29.aspx +// On linux sizes of long depends on the architecture (4B/x86 vs 86/amd64) +// Windows compiler requires int/long type for those instrinsics +#ifdef WIN32 +typedef long vol_t; +#else +typedef s32 vol_t; +#endif + __fi u32 Threading::AtomicRead(volatile u32& Target) { return Target; // Properly-aligned 32-bit reads are atomic } @@ -797,35 +805,35 @@ __fi s32 Threading::AtomicRead(volatile s32& Target) { } __fi u32 Threading::AtomicExchange(volatile u32& Target, u32 value ) { - return _InterlockedExchange( (volatile s32*)&Target, value ); + return _InterlockedExchange( (volatile vol_t*)&Target, value ); } __fi s32 Threading::AtomicExchange( volatile s32& Target, s32 value ) { - return _InterlockedExchange( (volatile s32*)&Target, value ); + return _InterlockedExchange( (volatile vol_t*)&Target, value ); } __fi u32 Threading::AtomicExchangeAdd( volatile u32& Target, u32 value ) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, value ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, value ); } __fi s32 Threading::AtomicExchangeAdd( volatile s32& Target, s32 value ) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, value ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, value ); } __fi s32 Threading::AtomicExchangeSub( volatile s32& Target, s32 value ) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, -value ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, -value ); } __fi u32 Threading::AtomicIncrement( volatile u32& Target ) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, 1 ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, 1 ); } __fi s32 Threading::AtomicIncrement( volatile s32& Target) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, 1 ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, 1 ); } __fi u32 Threading::AtomicDecrement( volatile u32& Target ) { - return _InterlockedExchangeAdd( (volatile s32*)&Target, -1 ); + return _InterlockedExchangeAdd( (volatile vol_t*)&Target, -1 ); } __fi s32 Threading::AtomicDecrement(volatile s32& Target) { - return _InterlockedExchangeAdd((volatile s32*)&Target, -1); + return _InterlockedExchangeAdd((volatile vol_t*)&Target, -1); } __fi void* Threading::_AtomicExchangePointer(volatile uptr& target, uptr value) @@ -833,7 +841,7 @@ __fi void* Threading::_AtomicExchangePointer(volatile uptr& target, uptr value) #ifdef _M_X86_64 // high-level atomic ops, please leave these 64 bit checks in place. return (void*)_InterlockedExchange64((volatile s64*)&target, value); #else - return (void*)_InterlockedExchange((volatile s32*)&target, value); + return (void*)_InterlockedExchange((volatile vol_t*)&target, value); #endif } diff --git a/common/src/Utilities/wxHelpers.cpp b/common/src/Utilities/wxHelpers.cpp index a0d189e3b4..9a0f4c584f 100644 --- a/common/src/Utilities/wxHelpers.cpp +++ b/common/src/Utilities/wxHelpers.cpp @@ -49,7 +49,7 @@ pxDialogCreationFlags pxDialogFlags() // bool BaseDeletableObject::MarkForDeletion() { - return !_InterlockedExchange( &m_IsBeingDeleted, true ); + return !Threading::AtomicExchange( m_IsBeingDeleted, true ); } void BaseDeletableObject::DeleteSelf()