Skip to content

Commit f753fd4

Browse files
DashCoreAutoGuixachow101PastaPastaPasta
authored andcommitted
Merge bitcoin#25491: wallet: use Mutex for g_sqlite_mutex instead of GlobalMutex
Co-authored-by: Andrew Chow <github@achow101.com> Co-authored-by: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com>
1 parent 39afc52 commit f753fd4

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/wallet/sqlite.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323
namespace wallet {
2424
static constexpr int32_t WALLET_SCHEMA_VERSION = 0;
2525

26-
static Mutex g_sqlite_mutex;
27-
static int g_sqlite_count GUARDED_BY(g_sqlite_mutex) = 0;
28-
2926
static Span<const std::byte> SpanFromBlob(sqlite3_stmt* stmt, int col)
3027
{
3128
return {reinterpret_cast<const std::byte*>(sqlite3_column_blob(stmt, col)),
@@ -104,6 +101,9 @@ static void SetPragma(sqlite3* db, const std::string& key, const std::string& va
104101
}
105102
}
106103

104+
Mutex SQLiteDatabase::g_sqlite_mutex;
105+
int SQLiteDatabase::g_sqlite_count = 0;
106+
107107
SQLiteDatabase::SQLiteDatabase(const fs::path& dir_path, const fs::path& file_path, const DatabaseOptions& options, bool mock)
108108
: WalletDatabase(), m_mock(mock), m_dir_path(fs::PathToString(dir_path)), m_file_path(fs::PathToString(file_path)), m_use_unsafe_sync(options.use_unsafe_sync)
109109
{
@@ -167,6 +167,8 @@ SQLiteDatabase::~SQLiteDatabase()
167167

168168
void SQLiteDatabase::Cleanup() noexcept
169169
{
170+
AssertLockNotHeld(g_sqlite_mutex);
171+
170172
Close();
171173

172174
LOCK(g_sqlite_mutex);

src/wallet/sqlite.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef BITCOIN_WALLET_SQLITE_H
66
#define BITCOIN_WALLET_SQLITE_H
77

8+
#include <sync.h>
89
#include <wallet/db.h>
910

1011
#include <sqlite3.h>
@@ -63,7 +64,16 @@ class SQLiteDatabase : public WalletDatabase
6364

6465
const std::string m_file_path;
6566

66-
void Cleanup() noexcept;
67+
/**
68+
* This mutex protects SQLite initialization and shutdown.
69+
* sqlite3_config() and sqlite3_shutdown() are not thread-safe (sqlite3_initialize() is).
70+
* Concurrent threads that execute SQLiteDatabase::SQLiteDatabase() should have just one
71+
* of them do the init and the rest wait for it to complete before all can proceed.
72+
*/
73+
static Mutex g_sqlite_mutex;
74+
static int g_sqlite_count GUARDED_BY(g_sqlite_mutex);
75+
76+
void Cleanup() noexcept EXCLUSIVE_LOCKS_REQUIRED(!g_sqlite_mutex);
6777

6878
public:
6979
SQLiteDatabase() = delete;

0 commit comments

Comments
 (0)