aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwarptangent <warptangent@tutanota.com>2016-02-08 04:57:16 -0800
committerwarptangent <warptangent@tutanota.com>2016-02-08 09:28:10 -0800
commit15ee0bef4b07dd177237380130b7c9accb3a215b (patch)
tree2ab05e083228086cfced6490585210d4e8921105 /src
parentMerge pull request #644 (diff)
downloadmonero-15ee0bef4b07dd177237380130b7c9accb3a215b.tar.xz
BlockchainLMDB: extract txn macros used during block add/remove
Diffstat (limited to 'src')
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 5982b9d9a..65003c61b 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -1265,6 +1265,32 @@ void BlockchainLMDB::unlock()
auto_txn.commit(); \
} while(0)
+
+// The below two macros are for DB access within block add/remove, whether
+// regular batch txn is in use or not. m_write_txn is used as a batch txn, even
+// if it's only within block add/remove.
+//
+// DB access functions that may be called both within block add/remove and
+// without should use these. If the function will be called ONLY within block
+// add/remove, m_write_txn alone may be used instead of these macros.
+
+#define TXN_BLOCK_PREFIX(flags); \
+ mdb_txn_safe auto_txn; \
+ mdb_txn_safe* txn_ptr = &auto_txn; \
+ if (m_batch_active || m_write_txn) \
+ txn_ptr = m_write_txn; \
+ else \
+ { \
+ if (auto mdb_res = mdb_txn_begin(m_env, NULL, flags, auto_txn)) \
+ throw0(DB_ERROR(lmdb_error(std::string("Failed to create a transaction for the db in ")+__FUNCTION__+": ", mdb_res).c_str())); \
+ } \
+
+#define TXN_BLOCK_POSTFIX_SUCCESS() \
+ do { \
+ if (! m_batch_active && ! m_write_txn) \
+ auto_txn.commit(); \
+ } while(0)
+
bool BlockchainLMDB::block_exists(const crypto::hash& h) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);