From afb1520ea148582c3da924db79a23041e0686d77 Mon Sep 17 00:00:00 2001 From: David Rose Date: Sun, 9 Apr 2006 20:03:22 +0000 Subject: [PATCH] add get_ptr(), set_ptr() --- dtool/src/dtoolbase/atomicAdjustDummyImpl.I | 27 +++++++++++++++++++++ dtool/src/dtoolbase/atomicAdjustDummyImpl.h | 3 +++ dtool/src/dtoolbase/atomicAdjustI386Impl.I | 27 +++++++++++++++++++++ dtool/src/dtoolbase/atomicAdjustI386Impl.h | 3 +++ dtool/src/dtoolbase/atomicAdjustNsprImpl.I | 25 +++++++++++++++++++ dtool/src/dtoolbase/atomicAdjustNsprImpl.h | 3 +++ dtool/src/dtoolbase/atomicAdjustWin32Impl.I | 27 +++++++++++++++++++++ dtool/src/dtoolbase/atomicAdjustWin32Impl.h | 3 +++ 8 files changed, 118 insertions(+) diff --git a/dtool/src/dtoolbase/atomicAdjustDummyImpl.I b/dtool/src/dtoolbase/atomicAdjustDummyImpl.I index 6ea0cab0ea..d92ecabc7a 100644 --- a/dtool/src/dtoolbase/atomicAdjustDummyImpl.I +++ b/dtool/src/dtoolbase/atomicAdjustDummyImpl.I @@ -66,6 +66,33 @@ get(const PN_int32 &var) { return var; } +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustDummyImpl::set_ptr +// Access: Public, Static +// Description: Atomically changes the indicated variable and +// returns the original value. +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustDummyImpl:: +set_ptr(void *&var, void *new_value) { + void *orig_value = var; + var = new_value; + return orig_value; +} + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustDummyImpl::get_ptr +// Access: Public, Static +// Description: Atomically retrieves the snapshot value of the +// indicated variable. This is the only guaranteed safe +// way to retrieve the value that other threads might be +// asynchronously setting, incrementing, or decrementing +// (via other AtomicAjust methods). +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustDummyImpl:: +get_ptr(void * const &var) { + return var; +} + //////////////////////////////////////////////////////////////////// // Function: AtomicAdjustDummyImpl::compare_and_exchange // Access: Public, Static diff --git a/dtool/src/dtoolbase/atomicAdjustDummyImpl.h b/dtool/src/dtoolbase/atomicAdjustDummyImpl.h index 696cb03f85..d4b75b5afa 100644 --- a/dtool/src/dtoolbase/atomicAdjustDummyImpl.h +++ b/dtool/src/dtoolbase/atomicAdjustDummyImpl.h @@ -42,6 +42,9 @@ public: INLINE static PN_int32 set(PN_int32 &var, PN_int32 new_value); INLINE static PN_int32 get(const PN_int32 &var); + INLINE static void *set_ptr(void *&var, void *new_value); + INLINE static void *get_ptr(void * const &var); + INLINE static PN_int32 compare_and_exchange(PN_int32 &mem, PN_int32 old_value, PN_int32 new_value); diff --git a/dtool/src/dtoolbase/atomicAdjustI386Impl.I b/dtool/src/dtoolbase/atomicAdjustI386Impl.I index 4b13776171..ddfa22f510 100644 --- a/dtool/src/dtoolbase/atomicAdjustI386Impl.I +++ b/dtool/src/dtoolbase/atomicAdjustI386Impl.I @@ -76,6 +76,33 @@ get(const PN_int32 &var) { return var; } +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustI386Impl::set_ptr +// Access: Public, Static +// Description: Atomically changes the indicated variable and +// returns the original value. +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustI386Impl:: +set_ptr(void *&var, void *new_value) { + void *orig_value = var; + var = new_value; + return orig_value; +} + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustI386Impl::get_ptr +// Access: Public, Static +// Description: Atomically retrieves the snapshot value of the +// indicated variable. This is the only guaranteed safe +// way to retrieve the value that other threads might be +// asynchronously setting, incrementing, or decrementing +// (via other AtomicAjust methods). +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustI386Impl:: +get_ptr(void * const &var) { + return var; +} + //////////////////////////////////////////////////////////////////// // Function: AtomicAdjustI386Impl::compare_and_exchange // Access: Public, Static diff --git a/dtool/src/dtoolbase/atomicAdjustI386Impl.h b/dtool/src/dtoolbase/atomicAdjustI386Impl.h index de76e20fb8..7df65a2723 100644 --- a/dtool/src/dtoolbase/atomicAdjustI386Impl.h +++ b/dtool/src/dtoolbase/atomicAdjustI386Impl.h @@ -43,6 +43,9 @@ public: INLINE static PN_int32 set(PN_int32 &var, PN_int32 new_value); INLINE static PN_int32 get(const PN_int32 &var); + INLINE static void *set_ptr(void *&var, void *new_value); + INLINE static void *get_ptr(void * const &var); + INLINE static PN_int32 compare_and_exchange(volatile PN_int32 &mem, PN_int32 old_value, PN_int32 new_value); diff --git a/dtool/src/dtoolbase/atomicAdjustNsprImpl.I b/dtool/src/dtoolbase/atomicAdjustNsprImpl.I index 04313de4f5..e454c2d629 100644 --- a/dtool/src/dtoolbase/atomicAdjustNsprImpl.I +++ b/dtool/src/dtoolbase/atomicAdjustNsprImpl.I @@ -63,3 +63,28 @@ INLINE PN_int32 AtomicAdjustNsprImpl:: get(const PN_int32 &var) { return var; } + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustNsprImpl::set_ptr +// Access: Public, Static +// Description: Atomically changes the indicated variable and +// returns the original value. +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustNsprImpl:: +set_ptr(void *&var, void *new_value) { + return PR_AtomicSet((PN_int32 *)&var, (PN_int32)new_value); +} + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustNsprImpl::get_ptr +// Access: Public, Static +// Description: Atomically retrieves the snapshot value of the +// indicated variable. This is the only guaranteed safe +// way to retrieve the value that other threads might be +// asynchronously setting, incrementing, or decrementing +// (via other AtomicAjust methods). +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustNsprImpl:: +get_ptr(void * const &var) { + return var; +} diff --git a/dtool/src/dtoolbase/atomicAdjustNsprImpl.h b/dtool/src/dtoolbase/atomicAdjustNsprImpl.h index 2a88923959..525a2b5138 100644 --- a/dtool/src/dtoolbase/atomicAdjustNsprImpl.h +++ b/dtool/src/dtoolbase/atomicAdjustNsprImpl.h @@ -38,6 +38,9 @@ public: INLINE static bool dec(PN_int32 &var); INLINE static PN_int32 set(PN_int32 &var, PN_int32 new_value); INLINE static PN_int32 get(const PN_int32 &var); + + INLINE static void *set_ptr(void *&var, void *new_value); + INLINE static void *get_ptr(void * const &var); }; #include "atomicAdjustNsprImpl.I" diff --git a/dtool/src/dtoolbase/atomicAdjustWin32Impl.I b/dtool/src/dtoolbase/atomicAdjustWin32Impl.I index ec19e900be..543446d007 100644 --- a/dtool/src/dtoolbase/atomicAdjustWin32Impl.I +++ b/dtool/src/dtoolbase/atomicAdjustWin32Impl.I @@ -63,3 +63,30 @@ INLINE PN_int32 AtomicAdjustWin32Impl:: get(const PN_int32 &var) { return var; } + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustWin32Impl::set_ptr +// Access: Public, Static +// Description: Atomically changes the indicated variable and +// returns the original value. +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustWin32Impl:: +set_ptr(void *&var, void *new_value) { + void *orig_value = var; + var = new_value; + return orig_value; +} + +//////////////////////////////////////////////////////////////////// +// Function: AtomicAdjustWin32Impl::get_ptr +// Access: Public, Static +// Description: Atomically retrieves the snapshot value of the +// indicated variable. This is the only guaranteed safe +// way to retrieve the value that other threads might be +// asynchronously setting, incrementing, or decrementing +// (via other AtomicAjust methods). +//////////////////////////////////////////////////////////////////// +INLINE void *AtomicAdjustWin32Impl:: +get_ptr(void * const &var) { + return var; +} diff --git a/dtool/src/dtoolbase/atomicAdjustWin32Impl.h b/dtool/src/dtoolbase/atomicAdjustWin32Impl.h index 3ce3109204..24f1850641 100644 --- a/dtool/src/dtoolbase/atomicAdjustWin32Impl.h +++ b/dtool/src/dtoolbase/atomicAdjustWin32Impl.h @@ -39,6 +39,9 @@ public: INLINE static bool dec(PN_int32 &var); INLINE static PN_int32 set(PN_int32 &var, PN_int32 new_value); INLINE static PN_int32 get(const PN_int32 &var); + + INLINE static void *set_ptr(void *&var, void *new_value); + INLINE static void *get_ptr(void * const &var); }; #include "atomicAdjustWin32Impl.I"