gsgbase: Switch gsg list to use patomic instead of AtomicAdjust

This commit is contained in:
rdb 2023-02-20 19:46:20 +01:00
parent 5d63c7e898
commit 9c4d08f589
2 changed files with 13 additions and 15 deletions

View File

@ -15,7 +15,7 @@
#include "lightMutexHolder.h" #include "lightMutexHolder.h"
#include <algorithm> #include <algorithm>
AtomicAdjust::Pointer GraphicsStateGuardianBase::_gsg_list; patomic<GraphicsStateGuardianBase::GSGList *> GraphicsStateGuardianBase::_gsg_list { nullptr };
UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq; UpdateSeq GraphicsStateGuardianBase::_generated_shader_seq;
TypeHandle GraphicsStateGuardianBase::_type_handle; TypeHandle GraphicsStateGuardianBase::_type_handle;
@ -29,7 +29,7 @@ TypeHandle GraphicsStateGuardianBase::_type_handle;
*/ */
GraphicsStateGuardianBase *GraphicsStateGuardianBase:: GraphicsStateGuardianBase *GraphicsStateGuardianBase::
get_default_gsg() { 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) { if (gsg_list == nullptr) {
// Nobody created a GSG list, so we won't have any GSGs either. // Nobody created a GSG list, so we won't have any GSGs either.
return nullptr; return nullptr;
@ -44,7 +44,7 @@ get_default_gsg() {
*/ */
void GraphicsStateGuardianBase:: void GraphicsStateGuardianBase::
set_default_gsg(GraphicsStateGuardianBase *default_gsg) { 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) { if (gsg_list == nullptr) {
// Nobody ever created a GSG list. How could we have a GSG? // Nobody ever created a GSG list. How could we have a GSG?
nassertv(false); nassertv(false);
@ -52,7 +52,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
} }
LightMutexHolder holder(gsg_list->_lock); 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. // The specified GSG doesn't exist or it has already destructed.
nassert_raise("GSG not found or already destructed"); nassert_raise("GSG not found or already destructed");
return; return;
@ -66,7 +66,7 @@ set_default_gsg(GraphicsStateGuardianBase *default_gsg) {
*/ */
size_t GraphicsStateGuardianBase:: size_t GraphicsStateGuardianBase::
get_num_gsgs() { 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) { if (gsg_list == nullptr) {
// Nobody created a GSG list, so we won't have any GSGs either. // Nobody created a GSG list, so we won't have any GSGs either.
return 0; return 0;
@ -81,7 +81,7 @@ get_num_gsgs() {
*/ */
GraphicsStateGuardianBase *GraphicsStateGuardianBase:: GraphicsStateGuardianBase *GraphicsStateGuardianBase::
get_gsg(size_t n) { 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); nassertr(gsg_list != nullptr, nullptr);
LightMutexHolder holder(gsg_list->_lock); LightMutexHolder holder(gsg_list->_lock);
@ -95,15 +95,12 @@ get_gsg(size_t n) {
*/ */
void GraphicsStateGuardianBase:: void GraphicsStateGuardianBase::
add_gsg(GraphicsStateGuardianBase *gsg) { 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) { if (gsg_list == nullptr) {
gsg_list = new GSGList; gsg_list = new GSGList;
gsg_list->_default_gsg = nullptr;
GSGList *orig_gsg_list = (GSGList *) GSGList *orig_gsg_list = nullptr;
AtomicAdjust::compare_and_exchange_ptr(_gsg_list, nullptr, gsg_list); if (!_gsg_list.compare_exchange_strong(orig_gsg_list, gsg_list, std::memory_order_release, std::memory_order_consume)) {
if (orig_gsg_list != nullptr) {
// Another thread beat us to it. No problem, we'll use that. // Another thread beat us to it. No problem, we'll use that.
delete gsg_list; delete gsg_list;
gsg_list = orig_gsg_list; gsg_list = orig_gsg_list;
@ -129,7 +126,7 @@ add_gsg(GraphicsStateGuardianBase *gsg) {
*/ */
void GraphicsStateGuardianBase:: void GraphicsStateGuardianBase::
remove_gsg(GraphicsStateGuardianBase *gsg) { 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) { if (gsg_list == nullptr) {
// No GSGs were added yet, or the program is destructing anyway. // No GSGs were added yet, or the program is destructing anyway.
return; return;

View File

@ -20,6 +20,7 @@
#include "nodeCachedReferenceCount.h" #include "nodeCachedReferenceCount.h"
#include "luse.h" #include "luse.h"
#include "lightMutex.h" #include "lightMutex.h"
#include "patomic.h"
// A handful of forward references. // A handful of forward references.
@ -264,9 +265,9 @@ private:
typedef pvector<GraphicsStateGuardianBase *> GSGs; typedef pvector<GraphicsStateGuardianBase *> GSGs;
GSGs _gsgs; GSGs _gsgs;
GraphicsStateGuardianBase *_default_gsg; GraphicsStateGuardianBase *_default_gsg = nullptr;
}; };
static AtomicAdjust::Pointer _gsg_list; static patomic<GSGList *> _gsg_list;
protected: protected:
static UpdateSeq _generated_shader_seq; static UpdateSeq _generated_shader_seq;