From 17cc1bd0a3cc0629bde12342757a242d9907d4e1 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 1 Nov 2011 17:18:55 +0000 Subject: [PATCH] fix 64-bit problem with memory tracking --- dtool/src/dtoolbase/atomicAdjustWin32Impl.I | 16 ++++++++++++++++ dtool/src/dtoolbase/atomicAdjustWin32Impl.h | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/dtool/src/dtoolbase/atomicAdjustWin32Impl.I b/dtool/src/dtoolbase/atomicAdjustWin32Impl.I index e1270622bf..c23a9ee87c 100644 --- a/dtool/src/dtoolbase/atomicAdjustWin32Impl.I +++ b/dtool/src/dtoolbase/atomicAdjustWin32Impl.I @@ -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 } //////////////////////////////////////////////////////////////////// diff --git a/dtool/src/dtoolbase/atomicAdjustWin32Impl.h b/dtool/src/dtoolbase/atomicAdjustWin32Impl.h index eacd7fc936..5bc1f36229 100644 --- a/dtool/src/dtoolbase/atomicAdjustWin32Impl.h +++ b/dtool/src/dtoolbase/atomicAdjustWin32Impl.h @@ -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);