From 550aad70241e3bc0d4270adeba48a8ac858e8ea7 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 4 Dec 2022 00:36:41 +0100 Subject: [PATCH] Fix some uses of `AtomicAdjust::Pointer` to use `patomic` --- dtool/src/dtoolutil/filename.cxx | 53 +++++++++++++++++++------------- dtool/src/dtoolutil/filename.h | 9 +++--- panda/src/putil/clockObject.I | 4 +-- panda/src/putil/clockObject.cxx | 13 ++++---- panda/src/putil/clockObject.h | 3 +- 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index f676220158..8d319e9b23 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -16,7 +16,6 @@ #include "dSearchPath.h" #include "executionEnvironment.h" #include "vector_string.h" -#include "atomicAdjust.h" #include // For rename() and tempnam() #include // for clock() and time() @@ -60,10 +59,10 @@ using std::wstring; TextEncoder::Encoding Filename::_filesystem_encoding = TextEncoder::E_utf8; -TVOLATILE AtomicAdjust::Pointer Filename::_home_directory; -TVOLATILE AtomicAdjust::Pointer Filename::_temp_directory; -TVOLATILE AtomicAdjust::Pointer Filename::_user_appdata_directory; -TVOLATILE AtomicAdjust::Pointer Filename::_common_appdata_directory; +patomic Filename::_home_directory(nullptr); +patomic Filename::_temp_directory(nullptr); +patomic Filename::_user_appdata_directory(nullptr); +patomic Filename::_common_appdata_directory(nullptr); TypeHandle Filename::_type_handle; #ifdef ANDROID @@ -486,7 +485,8 @@ temporary(const string &dirname, const string &prefix, const string &suffix, */ const Filename &Filename:: get_home_directory() { - if (AtomicAdjust::get_ptr(_home_directory) == nullptr) { + Filename *curdir = _home_directory.load(std::memory_order_consume); + if (curdir == nullptr) { Filename home_directory; // In all environments except Windows, check $HOME first. @@ -538,14 +538,16 @@ get_home_directory() { } Filename *newdir = new Filename(home_directory); - if (AtomicAdjust::compare_and_exchange_ptr(_home_directory, nullptr, newdir) != nullptr) { + if (_home_directory.compare_exchange_strong(curdir, newdir, std::memory_order_release, std::memory_order_consume)) { + return *newdir; + } else { // Didn't store it. Must have been stored by someone else. - assert(_home_directory != nullptr); + assert(curdir != nullptr); delete newdir; } } - return (*(Filename *)_home_directory); + return *curdir; } /** @@ -553,7 +555,8 @@ get_home_directory() { */ const Filename &Filename:: get_temp_directory() { - if (AtomicAdjust::get_ptr(_temp_directory) == nullptr) { + Filename *curdir = _temp_directory.load(std::memory_order_consume); + if (curdir == nullptr) { Filename temp_directory; #ifdef _WIN32 @@ -586,14 +589,16 @@ get_temp_directory() { } Filename *newdir = new Filename(temp_directory); - if (AtomicAdjust::compare_and_exchange_ptr(_temp_directory, nullptr, newdir) != nullptr) { + if (_temp_directory.compare_exchange_strong(curdir, newdir, std::memory_order_release, std::memory_order_consume)) { + return *newdir; + } else { // Didn't store it. Must have been stored by someone else. - assert(_temp_directory != nullptr); + assert(curdir != nullptr); delete newdir; } } - return (*(Filename *)_temp_directory); + return *curdir; } /** @@ -603,7 +608,8 @@ get_temp_directory() { */ const Filename &Filename:: get_user_appdata_directory() { - if (AtomicAdjust::get_ptr(_user_appdata_directory) == nullptr) { + Filename *curdir = _user_appdata_directory.load(std::memory_order_consume); + if (curdir == nullptr) { Filename user_appdata_directory; #ifdef _WIN32 @@ -643,14 +649,16 @@ get_user_appdata_directory() { } Filename *newdir = new Filename(user_appdata_directory); - if (AtomicAdjust::compare_and_exchange_ptr(_user_appdata_directory, nullptr, newdir) != nullptr) { + if (_user_appdata_directory.compare_exchange_strong(curdir, newdir, std::memory_order_release, std::memory_order_consume)) { + return *newdir; + } else { // Didn't store it. Must have been stored by someone else. - assert(_user_appdata_directory != nullptr); + assert(curdir != nullptr); delete newdir; } } - return (*(Filename *)_user_appdata_directory); + return *curdir; } /** @@ -659,7 +667,8 @@ get_user_appdata_directory() { */ const Filename &Filename:: get_common_appdata_directory() { - if (AtomicAdjust::get_ptr(_common_appdata_directory) == nullptr) { + Filename *curdir = _common_appdata_directory.load(std::memory_order_consume); + if (curdir == nullptr) { Filename common_appdata_directory; #ifdef _WIN32 @@ -693,14 +702,16 @@ get_common_appdata_directory() { } Filename *newdir = new Filename(common_appdata_directory); - if (AtomicAdjust::compare_and_exchange_ptr(_common_appdata_directory, nullptr, newdir) != nullptr) { + if (_common_appdata_directory.compare_exchange_strong(curdir, newdir, std::memory_order_release, std::memory_order_consume)) { + return *newdir; + } else { // Didn't store it. Must have been stored by someone else. - assert(_common_appdata_directory != nullptr); + assert(curdir != nullptr); delete newdir; } } - return (*(Filename *)_common_appdata_directory); + return *curdir; } /** diff --git a/dtool/src/dtoolutil/filename.h b/dtool/src/dtoolutil/filename.h index f3065034ca..3e3812f711 100644 --- a/dtool/src/dtoolutil/filename.h +++ b/dtool/src/dtoolutil/filename.h @@ -20,6 +20,7 @@ #include "register_type.h" #include "vector_string.h" #include "textEncoder.h" +#include "patomic.h" #include @@ -265,10 +266,10 @@ protected: int _flags; static TextEncoder::Encoding _filesystem_encoding; - static TVOLATILE AtomicAdjust::Pointer _home_directory; - static TVOLATILE AtomicAdjust::Pointer _temp_directory; - static TVOLATILE AtomicAdjust::Pointer _user_appdata_directory; - static TVOLATILE AtomicAdjust::Pointer _common_appdata_directory; + static patomic _home_directory; + static patomic _temp_directory; + static patomic _user_appdata_directory; + static patomic _common_appdata_directory; #ifdef ANDROID public: diff --git a/panda/src/putil/clockObject.I b/panda/src/putil/clockObject.I index 404aa82aca..bf4a805c2c 100644 --- a/panda/src/putil/clockObject.I +++ b/panda/src/putil/clockObject.I @@ -213,10 +213,10 @@ check_errors(Thread *current_thread) { */ INLINE ClockObject *ClockObject:: get_global_clock() { - ClockObject *clock = (ClockObject *)AtomicAdjust::get_ptr(_global_clock); + ClockObject *clock = _global_clock.load(std::memory_order_consume); if (UNLIKELY(clock == nullptr)) { make_global_clock(); - clock = (ClockObject *)_global_clock; + clock = _global_clock.load(std::memory_order_consume); } return clock; } diff --git a/panda/src/putil/clockObject.cxx b/panda/src/putil/clockObject.cxx index d275390258..8fa128616f 100644 --- a/panda/src/putil/clockObject.cxx +++ b/panda/src/putil/clockObject.cxx @@ -25,7 +25,7 @@ void (*ClockObject::_start_clock_wait)() = ClockObject::dummy_clock_wait; void (*ClockObject::_start_clock_busy_wait)() = ClockObject::dummy_clock_wait; void (*ClockObject::_stop_clock_wait)() = ClockObject::dummy_clock_wait; -AtomicAdjust::Pointer ClockObject::_global_clock = nullptr; +patomic ClockObject::_global_clock(nullptr); TypeHandle ClockObject::_type_handle; /** @@ -162,7 +162,7 @@ set_real_time(double time) { #ifdef NOTIFY_DEBUG // This is only a debug message, since it happens during normal development, // particularly at startup, or whenever you break into the task loop. - if (util_cat.is_debug() && this == _global_clock) { + if (util_cat.is_debug() && this == _global_clock.load(std::memory_order_relaxed)) { util_cat.debug() << "Adjusting global clock's real time by " << time - get_real_time() << " seconds.\n"; @@ -181,7 +181,7 @@ void ClockObject:: set_frame_time(double time, Thread *current_thread) { nassertv(current_thread->get_pipeline_stage() == 0); #ifdef NOTIFY_DEBUG - if (this == _global_clock && _mode != M_slave) { + if (this == _global_clock.load(std::memory_order_relaxed) && _mode != M_slave) { util_cat.warning() << "Adjusting global clock's frame time by " << time - get_frame_time() << " seconds.\n"; @@ -204,7 +204,7 @@ void ClockObject:: set_frame_count(int frame_count, Thread *current_thread) { nassertv(current_thread->get_pipeline_stage() == 0); #ifdef NOTIFY_DEBUG - if (this == _global_clock && _mode != M_slave) { + if (this == _global_clock.load(std::memory_order_relaxed) && _mode != M_slave) { util_cat.warning() << "Adjusting global clock's frame count by " << frame_count - get_frame_count() << " frames.\n"; @@ -522,8 +522,6 @@ wait_until(double want_time) { */ void ClockObject:: make_global_clock() { - nassertv(_global_clock == nullptr); - ConfigVariableEnum clock_mode ("clock-mode", ClockObject::M_normal, PRC_DESC("Specifies the mode of the global clock. The default mode, normal, " @@ -534,7 +532,8 @@ make_global_clock() { ClockObject *clock = new ClockObject(clock_mode); clock->local_object(); - if (AtomicAdjust::compare_and_exchange_ptr(_global_clock, nullptr, clock) != nullptr) { + ClockObject *expected = nullptr; + if (!_global_clock.compare_exchange_strong(expected, clock, std::memory_order_release, std::memory_order_relaxed)) { // Another thread beat us to it. delete clock; } diff --git a/panda/src/putil/clockObject.h b/panda/src/putil/clockObject.h index 4f2c93cfa5..7c74e4d701 100644 --- a/panda/src/putil/clockObject.h +++ b/panda/src/putil/clockObject.h @@ -27,6 +27,7 @@ #include "referenceCount.h" #include "pointerTo.h" #include "vector_double.h" // needed to see exported allocators for pdeque +#include "patomic.h" class EXPCL_PANDA_PUTIL TimeVal { PUBLISHED: @@ -172,7 +173,7 @@ private: typedef CycleDataWriter CDWriter; typedef CycleDataStageReader CDStageReader; - static AtomicAdjust::Pointer _global_clock; + static patomic _global_clock; public: static TypeHandle get_class_type() {