Fix crashes on database save

* Add saving mutex to database class to prevent re-entrant saving
* Prevent saving multiple times to the same file if the database is not marked as modified
* Prevent locking the database while saving. This also prevents closing the application and database tab while saving.
* FileWatcher: only perform async checksum calculations when triggered by timer (prevents random GUI freezes)
* Re-attempt database lock when requested during save operation
* Prevent database tabs from closing before all databases are locked on quit
This commit is contained in:
Jonathan White
2020-03-05 22:59:07 -05:00
parent 6bce5836f9
commit 7ac292e09b
12 changed files with 122 additions and 40 deletions

View File

@@ -21,6 +21,7 @@
#include <QDateTime>
#include <QHash>
#include <QMutex>
#include <QPointer>
#include <QScopedPointer>
#include <QTimer>
@@ -85,6 +86,7 @@ public:
void setEmitModified(bool value);
bool isReadOnly() const;
void setReadOnly(bool readOnly);
bool isSaving();
QUuid uuid() const;
QString filePath() const;
@@ -208,6 +210,7 @@ private:
QPointer<Group> m_rootGroup;
QList<DeletedObject> m_deletedObjects;
QTimer m_modifiedTimer;
QMutex m_saveMutex;
QPointer<FileWatcher> m_fileWatcher;
bool m_initialized = false;
bool m_modified = false;