1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00

Unitary thread review (#623)

* Fix uninitialized members of ProjectFileIO...

... which fixes this problem I observed:

Opening a previously saved project, saving-as to another path, then exiting
Audacity, gives a progress dialog waiting for checkpoints to end, which doesn't
go away

* Remove two mutexes...

... One wasn't used at all, and another was only ever used by one thread, and
then not correctly unlocked for each locking on all possible paths.

* Values that the worker thread writes and main reads should be atomic

* Remember to close db connections even after failure to open
This commit is contained in:
Paul Licameli 2020-07-20 21:17:45 -04:00 committed by GitHub
parent 061208c5cf
commit 17a4958173
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 13 deletions

View File

@ -311,11 +311,8 @@ void ProjectFileIO::CheckpointThread()
}
// Capture the number of pages that need checkpointing and reset
mCheckpointCurrentPages = mCheckpointWaitingPages;
mCheckpointCurrentPages.store( mCheckpointWaitingPages );
mCheckpointWaitingPages = 0;
// Lock out others while the checkpoint is running
mCheckpointActive.lock();
}
// Open another connection to the DB to prevent blocking the main thread.
@ -334,10 +331,10 @@ void ProjectFileIO::CheckpointThread()
// Reset
mCheckpointCurrentPages = 0;
// Checkpoint is complete
mCheckpointActive.unlock();
}
else
// Gotta close it anyway!
sqlite3_close( db );
}
return;
@ -348,7 +345,7 @@ int ProjectFileIO::CheckpointHook(void *data, sqlite3 *db, const char *schema, i
// Get access to our object
ProjectFileIO *that = static_cast<ProjectFileIO *>(data);
// Qeuue the database pointer for our checkpoint thread to process
// Queue the database pointer for our checkpoint thread to process
std::lock_guard<std::mutex> guard(that->mCheckpointMutex);
that->mCheckpointWaitingPages = pages;
that->mCheckpointCondition.notify_one();

View File

@ -229,11 +229,9 @@ private:
std::thread mCheckpointThread;
std::condition_variable mCheckpointCondition;
std::mutex mCheckpointMutex;
std::mutex mCheckpointActive;
std::mutex mCheckpointClose;
std::atomic_bool mCheckpointStop;
uint64_t mCheckpointWaitingPages;
uint64_t mCheckpointCurrentPages;
std::atomic_bool mCheckpointStop{ false };
std::atomic< std::uint64_t > mCheckpointWaitingPages{ 0 };
std::atomic< std::uint64_t > mCheckpointCurrentPages{ 0 };
friend SqliteSampleBlock;
friend AutoCommitTransaction;