Browse Source

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

rdb 3 years ago
parent
commit
550aad7024

+ 32 - 21
dtool/src/dtoolutil/filename.cxx

@@ -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;
 }
 
 /**

+ 5 - 4
dtool/src/dtoolutil/filename.h

@@ -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:

+ 2 - 2
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;
 }

+ 6 - 7
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 *> 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;
   }

+ 2 - 1
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<CData> CDWriter;
   typedef CycleDataStageReader<CData> CDStageReader;
 
-  static AtomicAdjust::Pointer _global_clock;
+  static patomic<ClockObject *> _global_clock;
 
 public:
   static TypeHandle get_class_type() {