mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-27 07:03:36 -04:00
Fix some uses of AtomicAdjust::Pointer
to use patomic<T *>
This commit is contained in:
parent
05b3fe2170
commit
550aad7024
@ -16,7 +16,6 @@
|
||||
#include "dSearchPath.h"
|
||||
#include "executionEnvironment.h"
|
||||
#include "vector_string.h"
|
||||
#include "atomicAdjust.h"
|
||||
|
||||
#include <stdio.h> // For rename() and tempnam()
|
||||
#include <time.h> // 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 *> Filename::_home_directory(nullptr);
|
||||
patomic<Filename *> Filename::_temp_directory(nullptr);
|
||||
patomic<Filename *> Filename::_user_appdata_directory(nullptr);
|
||||
patomic<Filename *> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "register_type.h"
|
||||
#include "vector_string.h"
|
||||
#include "textEncoder.h"
|
||||
#include "patomic.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
@ -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<Filename *> _home_directory;
|
||||
static patomic<Filename *> _temp_directory;
|
||||
static patomic<Filename *> _user_appdata_directory;
|
||||
static patomic<Filename *> _common_appdata_directory;
|
||||
|
||||
#ifdef ANDROID
|
||||
public:
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 *> 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<ClockObject::Mode> 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;
|
||||
}
|
||||
|
@ -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<CData> CDWriter;
|
||||
typedef CycleDataStageReader<CData> CDStageReader;
|
||||
|
||||
static AtomicAdjust::Pointer _global_clock;
|
||||
static patomic<ClockObject *> _global_clock;
|
||||
|
||||
public:
|
||||
static TypeHandle get_class_type() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user