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

View File

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