Fix some uses of AtomicAdjust::Pointer to use patomic<T *>

This commit is contained in:
rdb 2022-12-04 00:36:41 +01:00
parent 05b3fe2170
commit 550aad7024
5 changed files with 47 additions and 35 deletions

View File

@ -16,7 +16,6 @@
#include "dSearchPath.h" #include "dSearchPath.h"
#include "executionEnvironment.h" #include "executionEnvironment.h"
#include "vector_string.h" #include "vector_string.h"
#include "atomicAdjust.h"
#include <stdio.h> // For rename() and tempnam() #include <stdio.h> // For rename() and tempnam()
#include <time.h> // for clock() and time() #include <time.h> // for clock() and time()
@ -60,10 +59,10 @@ using std::wstring;
TextEncoder::Encoding Filename::_filesystem_encoding = TextEncoder::E_utf8; TextEncoder::Encoding Filename::_filesystem_encoding = TextEncoder::E_utf8;
TVOLATILE AtomicAdjust::Pointer Filename::_home_directory; patomic<Filename *> Filename::_home_directory(nullptr);
TVOLATILE AtomicAdjust::Pointer Filename::_temp_directory; patomic<Filename *> Filename::_temp_directory(nullptr);
TVOLATILE AtomicAdjust::Pointer Filename::_user_appdata_directory; patomic<Filename *> Filename::_user_appdata_directory(nullptr);
TVOLATILE AtomicAdjust::Pointer Filename::_common_appdata_directory; patomic<Filename *> Filename::_common_appdata_directory(nullptr);
TypeHandle Filename::_type_handle; TypeHandle Filename::_type_handle;
#ifdef ANDROID #ifdef ANDROID
@ -486,7 +485,8 @@ temporary(const string &dirname, const string &prefix, const string &suffix,
*/ */
const Filename &Filename:: const Filename &Filename::
get_home_directory() { 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; Filename home_directory;
// In all environments except Windows, check $HOME first. // In all environments except Windows, check $HOME first.
@ -538,14 +538,16 @@ get_home_directory() {
} }
Filename *newdir = new Filename(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. // Didn't store it. Must have been stored by someone else.
assert(_home_directory != nullptr); assert(curdir != nullptr);
delete newdir; delete newdir;
} }
} }
return (*(Filename *)_home_directory); return *curdir;
} }
/** /**
@ -553,7 +555,8 @@ get_home_directory() {
*/ */
const Filename &Filename:: const Filename &Filename::
get_temp_directory() { 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; Filename temp_directory;
#ifdef _WIN32 #ifdef _WIN32
@ -586,14 +589,16 @@ get_temp_directory() {
} }
Filename *newdir = new Filename(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. // Didn't store it. Must have been stored by someone else.
assert(_temp_directory != nullptr); assert(curdir != nullptr);
delete newdir; delete newdir;
} }
} }
return (*(Filename *)_temp_directory); return *curdir;
} }
/** /**
@ -603,7 +608,8 @@ get_temp_directory() {
*/ */
const Filename &Filename:: const Filename &Filename::
get_user_appdata_directory() { 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; Filename user_appdata_directory;
#ifdef _WIN32 #ifdef _WIN32
@ -643,14 +649,16 @@ get_user_appdata_directory() {
} }
Filename *newdir = new Filename(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. // Didn't store it. Must have been stored by someone else.
assert(_user_appdata_directory != nullptr); assert(curdir != nullptr);
delete newdir; delete newdir;
} }
} }
return (*(Filename *)_user_appdata_directory); return *curdir;
} }
/** /**
@ -659,7 +667,8 @@ get_user_appdata_directory() {
*/ */
const Filename &Filename:: const Filename &Filename::
get_common_appdata_directory() { 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; Filename common_appdata_directory;
#ifdef _WIN32 #ifdef _WIN32
@ -693,14 +702,16 @@ get_common_appdata_directory() {
} }
Filename *newdir = new Filename(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. // Didn't store it. Must have been stored by someone else.
assert(_common_appdata_directory != nullptr); assert(curdir != nullptr);
delete newdir; delete newdir;
} }
} }
return (*(Filename *)_common_appdata_directory); return *curdir;
} }
/** /**

View File

@ -20,6 +20,7 @@
#include "register_type.h" #include "register_type.h"
#include "vector_string.h" #include "vector_string.h"
#include "textEncoder.h" #include "textEncoder.h"
#include "patomic.h"
#include <assert.h> #include <assert.h>
@ -265,10 +266,10 @@ protected:
int _flags; int _flags;
static TextEncoder::Encoding _filesystem_encoding; static TextEncoder::Encoding _filesystem_encoding;
static TVOLATILE AtomicAdjust::Pointer _home_directory; static patomic<Filename *> _home_directory;
static TVOLATILE AtomicAdjust::Pointer _temp_directory; static patomic<Filename *> _temp_directory;
static TVOLATILE AtomicAdjust::Pointer _user_appdata_directory; static patomic<Filename *> _user_appdata_directory;
static TVOLATILE AtomicAdjust::Pointer _common_appdata_directory; static patomic<Filename *> _common_appdata_directory;
#ifdef ANDROID #ifdef ANDROID
public: public:

View File

@ -213,10 +213,10 @@ check_errors(Thread *current_thread) {
*/ */
INLINE ClockObject *ClockObject:: INLINE ClockObject *ClockObject::
get_global_clock() { get_global_clock() {
ClockObject *clock = (ClockObject *)AtomicAdjust::get_ptr(_global_clock); ClockObject *clock = _global_clock.load(std::memory_order_consume);
if (UNLIKELY(clock == nullptr)) { if (UNLIKELY(clock == nullptr)) {
make_global_clock(); make_global_clock();
clock = (ClockObject *)_global_clock; clock = _global_clock.load(std::memory_order_consume);
} }
return clock; return clock;
} }

View File

@ -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::_start_clock_busy_wait)() = ClockObject::dummy_clock_wait;
void (*ClockObject::_stop_clock_wait)() = ClockObject::dummy_clock_wait; void (*ClockObject::_stop_clock_wait)() = ClockObject::dummy_clock_wait;
AtomicAdjust::Pointer ClockObject::_global_clock = nullptr; patomic<ClockObject *> ClockObject::_global_clock(nullptr);
TypeHandle ClockObject::_type_handle; TypeHandle ClockObject::_type_handle;
/** /**
@ -162,7 +162,7 @@ set_real_time(double time) {
#ifdef NOTIFY_DEBUG #ifdef NOTIFY_DEBUG
// This is only a debug message, since it happens during normal development, // This is only a debug message, since it happens during normal development,
// particularly at startup, or whenever you break into the task loop. // 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() util_cat.debug()
<< "Adjusting global clock's real time by " << time - get_real_time() << "Adjusting global clock's real time by " << time - get_real_time()
<< " seconds.\n"; << " seconds.\n";
@ -181,7 +181,7 @@ void ClockObject::
set_frame_time(double time, Thread *current_thread) { set_frame_time(double time, Thread *current_thread) {
nassertv(current_thread->get_pipeline_stage() == 0); nassertv(current_thread->get_pipeline_stage() == 0);
#ifdef NOTIFY_DEBUG #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() util_cat.warning()
<< "Adjusting global clock's frame time by " << time - get_frame_time() << "Adjusting global clock's frame time by " << time - get_frame_time()
<< " seconds.\n"; << " seconds.\n";
@ -204,7 +204,7 @@ void ClockObject::
set_frame_count(int frame_count, Thread *current_thread) { set_frame_count(int frame_count, Thread *current_thread) {
nassertv(current_thread->get_pipeline_stage() == 0); nassertv(current_thread->get_pipeline_stage() == 0);
#ifdef NOTIFY_DEBUG #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() util_cat.warning()
<< "Adjusting global clock's frame count by " << "Adjusting global clock's frame count by "
<< frame_count - get_frame_count() << " frames.\n"; << frame_count - get_frame_count() << " frames.\n";
@ -522,8 +522,6 @@ wait_until(double want_time) {
*/ */
void ClockObject:: void ClockObject::
make_global_clock() { make_global_clock() {
nassertv(_global_clock == nullptr);
ConfigVariableEnum<ClockObject::Mode> clock_mode ConfigVariableEnum<ClockObject::Mode> clock_mode
("clock-mode", ClockObject::M_normal, ("clock-mode", ClockObject::M_normal,
PRC_DESC("Specifies the mode of the global clock. The default mode, 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); ClockObject *clock = new ClockObject(clock_mode);
clock->local_object(); 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. // Another thread beat us to it.
delete clock; delete clock;
} }

View File

@ -27,6 +27,7 @@
#include "referenceCount.h" #include "referenceCount.h"
#include "pointerTo.h" #include "pointerTo.h"
#include "vector_double.h" // needed to see exported allocators for pdeque #include "vector_double.h" // needed to see exported allocators for pdeque
#include "patomic.h"
class EXPCL_PANDA_PUTIL TimeVal { class EXPCL_PANDA_PUTIL TimeVal {
PUBLISHED: PUBLISHED:
@ -172,7 +173,7 @@ private:
typedef CycleDataWriter<CData> CDWriter; typedef CycleDataWriter<CData> CDWriter;
typedef CycleDataStageReader<CData> CDStageReader; typedef CycleDataStageReader<CData> CDStageReader;
static AtomicAdjust::Pointer _global_clock; static patomic<ClockObject *> _global_clock;
public: public:
static TypeHandle get_class_type() { static TypeHandle get_class_type() {