database: flip to recursive_mutex to allow nested locks (#1937)

* Fix crash from db locking

* Change db lock to use recursive_mutex
This commit is contained in:
Corey D
2023-03-29 20:03:03 -07:00
committed by GitHub
parent 5ba9816377
commit c5087d7a39
4 changed files with 7 additions and 3 deletions
+1 -1
View File
@@ -70,7 +70,7 @@ public:
const DatabaseInfo &GetInfo(); const DatabaseInfo &GetInfo();
private: private:
MYSQL *m_mysql; MYSQL *m_mysql;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
/* ---------- */ /* ---------- */
DatabaseInfo m_Info; DatabaseInfo m_Info;
+1 -1
View File
@@ -71,7 +71,7 @@ public:
void SetLastIDAndRows(unsigned int insertID, unsigned int affectedRows); void SetLastIDAndRows(unsigned int insertID, unsigned int affectedRows);
private: private:
PGconn *m_pgsql; PGconn *m_pgsql;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
unsigned int m_lastInsertID; unsigned int m_lastInsertID;
unsigned int m_lastAffectedRows; unsigned int m_lastAffectedRows;
+1 -1
View File
@@ -70,7 +70,7 @@ public:
} }
private: private:
sqlite3 *m_sq3; sqlite3 *m_sq3;
std::mutex m_FullLock; std::recursive_mutex m_FullLock;
bool m_Persistent; bool m_Persistent;
String m_LastError; String m_LastError;
int m_LastErrorCode; int m_LastErrorCode;
+4
View File
@@ -959,6 +959,10 @@ native bool SQL_Execute(Handle statement);
* If the lock cannot be acquired, the main thread will pause until the * If the lock cannot be acquired, the main thread will pause until the
* threaded operation has concluded. * threaded operation has concluded.
* *
* Care should be taken to not lock an already-locked database. Internally,
* lock calls are nested recursively and must be paired with an equal amount
* of unlocks to be undone. This behaviour should not be relied on.
*
* @param database A database Handle. * @param database A database Handle.
* @error Invalid database Handle. * @error Invalid database Handle.
*/ */