mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-27 15:25:54 -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 "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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user