Потокобезопасная версия в отдельном классе и удаление лишних методов

This commit is contained in:
Andrei Astafev 2020-04-09 09:34:55 +03:00
parent df9b2ff599
commit a39e514278
4 changed files with 29 additions and 187 deletions

View File

@ -3,25 +3,34 @@
#include <myx/base/config.hpp>
#include <myx/filesystem/paths.hpp>
#include <myx/filesystem/paths_mt.hpp>
#include <QCoreApplication>
#include <QDebug>
namespace MF = myx::filesystem;
// Переменные для защиты экземпляра класса MF::Paths
std::atomic< MF::Paths* > MF::Paths::mInstance;
std::mutex MF::Paths::mMutex;
// Переменные для защиты экземпляра класса MF::PathsMT
std::atomic< MF::PathsMT* > MF::PathsMT::mInstance;
std::mutex MF::PathsMT::mMutex;
int main( int argc, char** argv )
{
(void)argc;
(void)argv;
QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) );
MF::Paths* paths = MF::Paths::getInstance();
MF::PathsMT* pathsMT = MF::PathsMT::instance();
MF::Paths* paths = MF::Paths::instance();
pathsMT->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
pathsMT->findConfigFile( QStringLiteral( "test" ) );
qDebug() << pathsMT->systemLogDirectory();
qDebug() << pathsMT->systemConfigDirectory();
paths->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
paths->makeDefaultDirectories();
paths->findConfigFile( QStringLiteral( "test" ) );
qDebug() << paths->systemConstDataDirectory();
qDebug() << paths->configFileName();
return( 0 );
}

View File

@ -5,12 +5,14 @@ set(current_target filesystem)
set(current_target_sources
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.cpp
)
# Список заголовочных файлов (используется для установки)
set(current_target_headers
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp
${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp
)
add_common_library(TARGET ${current_target}

View File

@ -13,23 +13,6 @@ namespace filesystem {
Paths::Paths() = default;
Paths* Paths::getInstance()
{
volatile Paths* localInstance = mInstance.load( std::memory_order_acquire );
if ( localInstance == nullptr )
{
std::lock_guard< std::mutex > myLock( mMutex );
localInstance = mInstance.load( std::memory_order_relaxed );
if ( localInstance == nullptr ) // -V1036
{
localInstance = new Paths();
mInstance.store( const_cast< Paths* >( localInstance ), std::memory_order_release ); // NOLINT
}
}
return( const_cast< Paths* >( localInstance ) ); // NOLINT
}
Paths::HierarchyType Paths::getHierarchyType()
{
QRegExp binRegexp( "/s*bin$" );
@ -143,7 +126,7 @@ bool Paths::init( const QString& projectDir, const QString& configFileExtension
m_homeDirectory = QString::fromLocal8Bit( qgetenv( "HOME" ) );
m_tempDirectory = QString::fromLocal8Bit( qgetenv( "TMPDIR" ) );
if ( m_tempDirectory.canonicalPath().isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) )
if ( m_tempDirectory.isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) )
{
m_tempDirectory = QStringLiteral( _PATH_TMP );
}
@ -230,162 +213,84 @@ const QDir& Paths::userConfigDirectory() const
}
void Paths::setUserConfigDirectory( const QString& userConfigDirectory )
{
m_userConfigDirectory = userConfigDirectory;
}
const QDir& Paths::systemConfigDirectory() const
{
return( m_systemConfigDirectory );
}
void Paths::setSystemConfigDirectory( const QString& systemConfigDirectory )
{
m_systemConfigDirectory = systemConfigDirectory;
}
const QFileInfo& Paths::configFilePath() const
{
return( m_configFilePath );
}
void Paths::setConfigFilePath( const QFileInfo& configFilePath )
{
m_configFilePath = configFilePath;
}
const QString& Paths::configFileName() const
{
return( m_configFileName );
}
void Paths::setConfigFileName( const QString& configFileName )
{
m_configFileName = configFileName;
}
const QString& Paths::configFileExtension() const
{
return( m_configFileExtension );
}
void Paths::setConfigFileExtension( const QString& configFileExtension )
{
m_configFileExtension = configFileExtension;
}
const QDir& Paths::userVarDataDirectory() const
{
return( m_userVarDataDirectory );
}
void Paths::setUserVarDataDirectory( const QString& userVarDataDirectory )
{
m_userVarDataDirectory = userVarDataDirectory;
}
const QDir& Paths::systemVarDataDirectory() const
{
return( m_systemVarDataDirectory );
}
void Paths::setSystemVarDataDirectory( const QString& systemVarDataDirectory )
{
m_systemVarDataDirectory = systemVarDataDirectory;
}
const QDir& Paths::userConstDataDirectory() const
{
return( m_userConstDataDirectory );
}
void Paths::setUserConstDataDirectory( const QString& userConstDataDirectory )
{
m_userConstDataDirectory = userConstDataDirectory;
}
const QDir& Paths::systemConstDataDirectory() const
{
return( m_systemConstDataDirectory );
}
void Paths::setSystemConstDataDirectory( const QString& systemConstDataDirectory )
{
m_systemConstDataDirectory = systemConstDataDirectory;
}
const QDir& Paths::userLogDirectory() const
{
return( m_userLogDirectory );
}
void Paths::setUserLogDirectory( const QString& userLogDirectory )
{
m_userLogDirectory = userLogDirectory;
}
const QDir& Paths::systemLogDirectory() const
{
return( m_systemLogDirectory );
}
void Paths::setSystemLogDirectory( const QString& systemLogDirectory )
{
m_systemLogDirectory = systemLogDirectory;
}
const QDir& Paths::tempDirectory() const
{
return( m_tempDirectory );
}
void Paths::setTempDirectory( const QString& tempDirectory )
{
m_tempDirectory = tempDirectory;
}
const QDir& Paths::homeDirectory() const
{
return( m_homeDirectory );
}
const QString& Paths::projectDirectoryName() const
const QString& Paths::projectName() const
{
return( m_projectName );
}
void Paths::setProjectDirectoryName( const QString& projectDirectoryName )
{
m_projectName = projectDirectoryName;
}
QString Paths::executableFileName() const
{
return( m_currentExecutable.m_canonicalFilePath.fileName() );

View File

@ -14,15 +14,11 @@
#include <QDir>
#include <QFileInfo>
#include <atomic>
#include <future>
#include <mutex>
#include <thread>
namespace myx {
namespace filesystem {
/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам
class Paths
{
enum class HierarchyType : intptr_t
@ -76,22 +72,25 @@ class Paths
/// @brief Расширение для файла настройки
QString m_configFileExtension;
HierarchyType getHierarchyType();
protected:
Paths();
~Paths() = default;
Paths( const Paths& ) = delete;
Paths& operator=( const Paths& ) = delete;
HierarchyType getHierarchyType();
static std::atomic< Paths* > mInstance;
static std::mutex mMutex;
public:
/**
* @brief getInstance
* @return Уникальный экземпляр класса Paths
*/
static Paths* getInstance();
static Paths* instance()
{
static Paths p;
return( &p );
}
/**
* @brief Обновление путей с учётом расположения исполняемого файла
@ -137,28 +136,16 @@ public:
* @brief Полный путь к файлу настройки
*/
const QFileInfo& configFilePath() const;
/**
* @brief Установка полного пути к файлу настройки
*/
void setConfigFilePath( const QFileInfo& configFilePath );
/**
* @brief Имя файла настройки
*/
const QString& configFileName() const;
/**
* @brief Установка имени файла настройки
*/
void setConfigFileName( const QString& configFileName );
/**
* @brief Расширение у файла настройки
*/
const QString& configFileExtension() const;
/**
* @brief Установка расширения у файла настройки
*/
void setConfigFileExtension( const QString& configFileExtension );
/**
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
@ -203,7 +190,7 @@ public:
/**
* @brief Имя подкаталога для проекта
*/
const QString& projectDirectoryName() const;
const QString& projectName() const;
/**
* @brief Имя исполняемого файла
@ -214,67 +201,6 @@ public:
* @brief Полный путь к исполняемому файлу
*/
const QFileInfo& executableFilePath() const;
private:
/**
* @brief Установка пути к базовому каталогу
*/
void setPrefixDirectory( const QString& prefixDirectory );
/**
* @brief Установка пути к каталогу с исполняемым файлом
*/
void setBinaryDirectory( const QString& binaryDirectory );
/**
* @brief Установка пути к пользовательскому каталогу с файлами настройки
*/
void setUserConfigDirectory( const QString& userConfigDirectory );
/**
* @brief Установка пути к системному каталогу с файлами настройки
*/
void setSystemConfigDirectory( const QString& systemConfigDirectory );
/**
* @brief Установка пути к пользовательскому каталогу с изменяемыми файлами
*/
void setUserVarDataDirectory( const QString& userVarDataDirectory );
/**
* @brief Установка пути к системному каталогу с изменяемыми файлами
*/
void setSystemVarDataDirectory( const QString& systemVarDataDirectory );
/**
* @brief Установка пути к пользовательскому каталогу с неизменяемыми файлами
*/
void setUserConstDataDirectory( const QString& userConstDataDirectory );
/**
* @brief Установка пути к системному каталогу с неизменяемыми файлами
*/
void setSystemConstDataDirectory( const QString& systemConstDataDirectory );
/**
* @brief Установка пути к пользовательскому каталогу с журналами работы
*/
void setUserLogDirectory( const QString& userLogDirectory );
/**
* @brief Установка пути к системному каталогу с журналами работы
*/
void setSystemLogDirectory( const QString& systemLogDirectory );
/**
* @brief Установка пути к каталогу с временными файлами
*/
void setTempDirectory( const QString& tempDirectory );
/**
* @brief Установка имени подкаталога для проекта
*/
void setProjectDirectoryName( const QString& projectDirectoryName );
}; // class Paths
} // namespace filesystem