wallet: use Mutex for g_sqlite_mutex instead of GlobalMutex

Using `Mutex` provides stronger guarantee than `GlobalMutex` wrt Clang's
thread safety analysis. Thus it is better to reduce the usage of
`GlobalMutex` in favor of `Mutex`.

Using `Mutex` for `g_sqlite_mutex` is ok because its usage is limited in
`wallet/sqlite.cpp` and it does not require propagating the negative
annotations to not relevant code.
This commit is contained in:
Vasil Dimov
2022-06-28 16:39:15 +02:00
parent 3f1f5f6f1e
commit 4163093d63
2 changed files with 16 additions and 4 deletions

View File

@@ -5,6 +5,7 @@
#ifndef BITCOIN_WALLET_SQLITE_H
#define BITCOIN_WALLET_SQLITE_H
#include <sync.h>
#include <wallet/db.h>
#include <sqlite3.h>
@@ -63,7 +64,16 @@ private:
const std::string m_file_path;
void Cleanup() noexcept;
/**
* This mutex protects SQLite initialization and shutdown.
* sqlite3_config() and sqlite3_shutdown() are not thread-safe (sqlite3_initialize() is).
* Concurrent threads that execute SQLiteDatabase::SQLiteDatabase() should have just one
* of them do the init and the rest wait for it to complete before all can proceed.
*/
static Mutex g_sqlite_mutex;
static int g_sqlite_count GUARDED_BY(g_sqlite_mutex);
void Cleanup() noexcept EXCLUSIVE_LOCKS_REQUIRED(!g_sqlite_mutex);
public:
SQLiteDatabase() = delete;