diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.cxx b/panda/src/gsgbase/graphicsStateGuardianBase.cxx index d8da758ee8..2802767ac6 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.cxx +++ b/panda/src/gsgbase/graphicsStateGuardianBase.cxx @@ -15,7 +15,7 @@ #include "lightMutexHolder.h" #include -AtomicAdjust::Pointer GraphicsStateGuardianBase::_gsg_list; +patomic GraphicsStateGuardianBase::_gsg_list { nullptr }; UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq; TypeHandle GraphicsStateGuardianBase::_type_handle; @@ -29,7 +29,7 @@ TypeHandle GraphicsStateGuardianBase::_type_handle; */ GraphicsStateGuardianBase *GraphicsStateGuardianBase:: get_default_gsg() { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); if (gsg_list == nullptr) { // Nobody created a GSG list, so we won't have any GSGs either. return nullptr; @@ -44,7 +44,7 @@ get_default_gsg() { */ void GraphicsStateGuardianBase:: set_default_gsg(GraphicsStateGuardianBase *default_gsg) { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); if (gsg_list == nullptr) { // Nobody ever created a GSG list. How could we have a GSG? nassertv(false); @@ -52,7 +52,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) { } LightMutexHolder holder(gsg_list->_lock); - if (find(gsg_list->_gsgs.begin(), gsg_list->_gsgs.end(), default_gsg) == gsg_list->_gsgs.end()) { + if (std::find(gsg_list->_gsgs.begin(), gsg_list->_gsgs.end(), default_gsg) == gsg_list->_gsgs.end()) { // The specified GSG doesn't exist or it has already destructed. nassert_raise("GSG not found or already destructed"); return; @@ -66,7 +66,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) { */ size_t GraphicsStateGuardianBase:: get_num_gsgs() { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); if (gsg_list == nullptr) { // Nobody created a GSG list, so we won't have any GSGs either. return 0; @@ -81,7 +81,7 @@ get_num_gsgs() { */ GraphicsStateGuardianBase *GraphicsStateGuardianBase:: get_gsg(size_t n) { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); nassertr(gsg_list != nullptr, nullptr); LightMutexHolder holder(gsg_list->_lock); @@ -95,15 +95,12 @@ get_gsg(size_t n) { */ void GraphicsStateGuardianBase:: add_gsg(GraphicsStateGuardianBase *gsg) { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); if (gsg_list == nullptr) { gsg_list = new GSGList; - gsg_list->_default_gsg = nullptr; - GSGList *orig_gsg_list = (GSGList *) - AtomicAdjust::compare_and_exchange_ptr(_gsg_list, nullptr, gsg_list); - - if (orig_gsg_list != nullptr) { + GSGList *orig_gsg_list = nullptr; + if (!_gsg_list.compare_exchange_strong(orig_gsg_list, gsg_list, std::memory_order_release, std::memory_order_consume)) { // Another thread beat us to it. No problem, we'll use that. delete gsg_list; gsg_list = orig_gsg_list; @@ -129,7 +126,7 @@ add_gsg(GraphicsStateGuardianBase *gsg) { */ void GraphicsStateGuardianBase:: remove_gsg(GraphicsStateGuardianBase *gsg) { - GSGList *gsg_list = (GSGList *)AtomicAdjust::get_ptr(_gsg_list); + GSGList *gsg_list = _gsg_list.load(std::memory_order_consume); if (gsg_list == nullptr) { // No GSGs were added yet, or the program is destructing anyway. return; diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index dd144cb859..b346ddeffd 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -20,6 +20,7 @@ #include "nodeCachedReferenceCount.h" #include "luse.h" #include "lightMutex.h" +#include "patomic.h" // A handful of forward references. @@ -264,9 +265,9 @@ private: typedef pvector GSGs; GSGs _gsgs; - GraphicsStateGuardianBase *_default_gsg; + GraphicsStateGuardianBase *_default_gsg = nullptr; }; - static AtomicAdjust::Pointer _gsg_list; + static patomic _gsg_list; protected: static UpdateSeq _generated_shader_seq;