diff options
Diffstat (limited to 'src/libs/utils/fsengine/fsengine.cpp')
-rw-r--r-- | src/libs/utils/fsengine/fsengine.cpp | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/libs/utils/fsengine/fsengine.cpp b/src/libs/utils/fsengine/fsengine.cpp index cc622b8786..fd343aaad1 100644 --- a/src/libs/utils/fsengine/fsengine.cpp +++ b/src/libs/utils/fsengine/fsengine.cpp @@ -10,6 +10,8 @@ class Utils::Internal::FSEngineHandler {}; #endif +#include <QMutex> + #include <memory> namespace Utils { @@ -29,46 +31,65 @@ bool FSEngine::isAvailable() #endif } -FilePaths FSEngine::registeredDeviceRoots() +template<class T> +class Locked +{ +public: + Locked(QMutex *mutex, T &object) + : m_object(object) + , m_locker(mutex) + {} + + T *operator->() const noexcept { return &m_object; } + const T operator*() const noexcept { return m_object; } + +private: + T &m_object; + QMutexLocker<QMutex> m_locker; +}; + +static Locked<Utils::FilePaths> deviceRoots() { - return FSEngine::deviceRoots(); + static FilePaths g_deviceRoots; + static QMutex mutex; + return {&mutex, g_deviceRoots}; } -void FSEngine::addDevice(const FilePath &deviceRoot) +static Locked<QStringList> deviceSchemes() { - deviceRoots().append(deviceRoot); + static QStringList g_deviceSchemes{"device"}; + static QMutex mutex; + return {&mutex, g_deviceSchemes}; } -void FSEngine::removeDevice(const FilePath &deviceRoot) +FilePaths FSEngine::registeredDeviceRoots() { - deviceRoots().removeAll(deviceRoot); + return *deviceRoots(); } -FilePaths &FSEngine::deviceRoots() +void FSEngine::addDevice(const FilePath &deviceRoot) { - static FilePaths g_deviceRoots; - return g_deviceRoots; + deviceRoots()->append(deviceRoot); } -QStringList &FSEngine::deviceSchemes() +void FSEngine::removeDevice(const FilePath &deviceRoot) { - static QStringList g_deviceSchemes{"device"}; - return g_deviceSchemes; + deviceRoots()->removeAll(deviceRoot); } void FSEngine::registerDeviceScheme(const QStringView scheme) { - deviceSchemes().append(scheme.toString()); + deviceSchemes()->append(scheme.toString()); } void FSEngine::unregisterDeviceScheme(const QStringView scheme) { - deviceSchemes().removeAll(scheme.toString()); + deviceSchemes()->removeAll(scheme.toString()); } QStringList FSEngine::registeredDeviceSchemes() { - return FSEngine::deviceSchemes(); + return *deviceSchemes(); } } // namespace Utils |