Add destructor for readtxns

Only if we created the readtxn. Was missing cleanups from exceptions before.
This commit is contained in:
Howard Chu 2016-03-16 10:24:48 +00:00
parent 057a019e41
commit a74348e115
2 changed files with 21 additions and 10 deletions

View File

@ -228,17 +228,24 @@ mdb_threadinfo::~mdb_threadinfo()
mdb_txn_abort(m_ti_rtxn); 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)
{
if (check)
{ {
while (creation_gate.test_and_set()); while (creation_gate.test_and_set());
num_active_txns++; num_active_txns++;
creation_gate.clear(); creation_gate.clear();
} }
}
mdb_txn_safe::~mdb_txn_safe() mdb_txn_safe::~mdb_txn_safe()
{ {
LOG_PRINT_L3("mdb_txn_safe: destructor"); 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 if (m_batch_txn) // this is a batch txn and should have been handled before this point for safety
{ {
@ -256,6 +263,7 @@ mdb_txn_safe::~mdb_txn_safe()
} }
mdb_txn_abort(m_txn); mdb_txn_abort(m_txn);
} }
if (m_check)
num_active_txns--; num_active_txns--;
} }
@ -1303,9 +1311,10 @@ void BlockchainLMDB::unlock()
#define TXN_PREFIX_RDONLY() \ #define TXN_PREFIX_RDONLY() \
MDB_txn *m_txn; \ MDB_txn *m_txn; \
mdb_txn_cursors *m_cursors; \ mdb_txn_cursors *m_cursors; \
bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); \
#define TXN_POSTFIX_RDONLY() \ mdb_txn_safe auto_txn(my_rtxn); \
if (my_rtxn) block_rtxn_stop() if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get()
#define TXN_POSTFIX_RDONLY()
#define TXN_POSTFIX_SUCCESS() \ #define TXN_POSTFIX_SUCCESS() \
do { \ do { \

View File

@ -115,7 +115,7 @@ typedef struct mdb_threadinfo
struct mdb_txn_safe struct mdb_txn_safe
{ {
mdb_txn_safe(); mdb_txn_safe(const bool check=true);
~mdb_txn_safe(); ~mdb_txn_safe();
void commit(std::string message = ""); void commit(std::string message = "");
@ -142,8 +142,10 @@ struct mdb_txn_safe
static void wait_no_active_txns(); static void wait_no_active_txns();
static void allow_new_txns(); static void allow_new_txns();
mdb_threadinfo* m_tinfo;
MDB_txn* m_txn; MDB_txn* m_txn;
bool m_batch_txn = false; bool m_batch_txn = false;
bool m_check;
static std::atomic<uint64_t> num_active_txns; static std::atomic<uint64_t> num_active_txns;
// could use a mutex here, but this should be sufficient. // could use a mutex here, but this should be sufficient.