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