fix 64-bit problem with memory tracking

This commit is contained in:
David Rose 2011-11-01 17:18:55 +00:00
parent dcc0d58c77
commit 17cc1bd0a3
2 changed files with 21 additions and 0 deletions

View File

@ -20,7 +20,11 @@
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void AtomicAdjustWin32Impl:: INLINE void AtomicAdjustWin32Impl::
inc(TVOLATILE AtomicAdjustWin32Impl::Integer &var) { inc(TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
#ifdef _WIN64
InterlockedIncrement64(&var);
#else
InterlockedIncrement(&var); InterlockedIncrement(&var);
#endif // _WIN64
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -32,7 +36,11 @@ inc(TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool AtomicAdjustWin32Impl:: INLINE bool AtomicAdjustWin32Impl::
dec(TVOLATILE AtomicAdjustWin32Impl::Integer &var) { dec(TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
#ifdef _WIN64
return (InterlockedDecrement64(&var) != 0);
#else
return (InterlockedDecrement(&var) != 0); return (InterlockedDecrement(&var) != 0);
#endif // _WIN64
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -57,7 +65,11 @@ add(TVOLATILE AtomicAdjustWin32Impl::Integer &var, AtomicAdjustWin32Impl::Intege
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl:: INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl::
set(TVOLATILE AtomicAdjustWin32Impl::Integer &var, AtomicAdjustWin32Impl::Integer new_value) { set(TVOLATILE AtomicAdjustWin32Impl::Integer &var, AtomicAdjustWin32Impl::Integer new_value) {
#ifdef _WIN64
return InterlockedExchange64(&var, new_value);
#else
return InterlockedExchange(&var, new_value); return InterlockedExchange(&var, new_value);
#endif // _WIN64
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -125,7 +137,11 @@ compare_and_exchange(TVOLATILE AtomicAdjustWin32Impl::Integer &mem, AtomicAdjust
AtomicAdjustWin32Impl::Integer new_value) { AtomicAdjustWin32Impl::Integer new_value) {
// Note that the AtomicAdjust parameter order is different from // Note that the AtomicAdjust parameter order is different from
// Windows convention! // Windows convention!
#ifdef _WIN64
return InterlockedCompareExchange64((TVOLATILE LONGLONG *)&mem, new_value, old_value);
#else
return InterlockedCompareExchange((TVOLATILE LONG *)&mem, new_value, old_value); return InterlockedCompareExchange((TVOLATILE LONG *)&mem, new_value, old_value);
#endif // _WIN64
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////

View File

@ -31,7 +31,12 @@
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class EXPCL_DTOOL AtomicAdjustWin32Impl { class EXPCL_DTOOL AtomicAdjustWin32Impl {
public: public:
#ifdef _WIN64
// For 64-bit builds, we'd prefer to use a 64-bit integer.
typedef LONGLONG Integer;
#else
typedef LONG Integer; typedef LONG Integer;
#endif // _WIN64
INLINE static void inc(TVOLATILE Integer &var); INLINE static void inc(TVOLATILE Integer &var);
INLINE static bool dec(TVOLATILE Integer &var); INLINE static bool dec(TVOLATILE Integer &var);