aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db/lmdb/db_lmdb.cpp
diff options
context:
space:
mode:
authorHoward Chu <hyc@symas.com>2016-03-16 10:24:48 +0000
committerHoward Chu <hyc@symas.com>2016-03-16 11:34:13 +0000
commita74348e1155e6c18b0748795848f56669011cd9b (patch)
tree6086237f090ba18c446dfa2608b7bc954b57acfa /src/blockchain_db/lmdb/db_lmdb.cpp
parentMerge pull request #727 (diff)
downloadmonero-a74348e1155e6c18b0748795848f56669011cd9b.tar.xz
Add destructor for readtxns
Only if we created the readtxn. Was missing cleanups from exceptions before.
Diffstat (limited to 'src/blockchain_db/lmdb/db_lmdb.cpp')
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index d2939bf96..9ae7b404b 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -228,17 +228,24 @@ mdb_threadinfo::~mdb_threadinfo()
mdb_txn_abort(m_ti_rtxn);
}
-mdb_txn_safe::mdb_txn_safe() : m_txn(NULL)
+mdb_txn_safe::mdb_txn_safe(const bool check) : m_txn(NULL), m_tinfo(NULL), m_check(check)
{
- while (creation_gate.test_and_set());
- num_active_txns++;
- creation_gate.clear();
+ if (check)
+ {
+ while (creation_gate.test_and_set());
+ num_active_txns++;
+ creation_gate.clear();
+ }
}
mdb_txn_safe::~mdb_txn_safe()
{
LOG_PRINT_L3("mdb_txn_safe: destructor");
- if (m_txn != nullptr)
+ if (m_tinfo != nullptr)
+ {
+ mdb_txn_reset(m_tinfo->m_ti_rtxn);
+ memset(&m_tinfo->m_ti_rflags, 0, sizeof(m_tinfo->m_ti_rflags));
+ } else if (m_txn != nullptr)
{
if (m_batch_txn) // this is a batch txn and should have been handled before this point for safety
{
@@ -256,7 +263,8 @@ mdb_txn_safe::~mdb_txn_safe()
}
mdb_txn_abort(m_txn);
}
- num_active_txns--;
+ if (m_check)
+ num_active_txns--;
}
void mdb_txn_safe::commit(std::string message)
@@ -1303,9 +1311,10 @@ void BlockchainLMDB::unlock()
#define TXN_PREFIX_RDONLY() \
MDB_txn *m_txn; \
mdb_txn_cursors *m_cursors; \
- bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors);
-#define TXN_POSTFIX_RDONLY() \
- if (my_rtxn) block_rtxn_stop()
+ bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); \
+ mdb_txn_safe auto_txn(my_rtxn); \
+ if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get()
+#define TXN_POSTFIX_RDONLY()
#define TXN_POSTFIX_SUCCESS() \
do { \