Use a single flush thread for ComputerManager

Some QSettings backends don't like concurrent writes and using a
single thread improves write batching behavior.
This commit is contained in:
Cameron Gutman
2022-10-25 02:07:16 -05:00
parent 59cae610d2
commit 16a9ed682e
2 changed files with 67 additions and 21 deletions

View File

@@ -15,6 +15,25 @@
#include <QSettings>
#include <QRunnable>
#include <QTimer>
#include <QMutex>
#include <QWaitCondition>
class DelayedFlushThread : public QThread
{
Q_OBJECT
public:
DelayedFlushThread(ComputerManager* cm)
: m_ComputerManager(cm)
{
setObjectName("CM Delayed Flush Thread");
}
void run();
private:
ComputerManager* m_ComputerManager;
};
class MdnsPendingComputer : public QObject
{
@@ -167,7 +186,7 @@ class ComputerManager : public QObject
friend class DeferredHostDeletionTask;
friend class PendingAddTask;
friend class PendingPairingTask;
friend class DeferredHostSaveTask;
friend class DelayedFlushThread;
public:
explicit ComputerManager(QObject *parent = nullptr);
@@ -229,5 +248,8 @@ private:
QMdnsEngine::Cache m_MdnsCache;
QVector<MdnsPendingComputer*> m_PendingResolution;
CompatFetcher m_CompatFetcher;
QAtomicInteger<bool> m_HostsListDirty;
DelayedFlushThread* m_DelayedFlushThread;
QMutex m_DelayedFlushMutex;
QWaitCondition m_DelayedFlushCondition;
bool m_NeedsDelayedFlush;
};