aboutsummaryrefslogtreecommitdiff
path: root/src/libwalletqt/TransactionHistory.cpp
diff options
context:
space:
mode:
authorluigi1111 <luigi1111w@gmail.com>2019-12-05 08:49:14 -0600
committerluigi1111 <luigi1111w@gmail.com>2019-12-05 08:49:14 -0600
commitfd9e7d00edcf7e8a37d9078c64a4d938e75da0b0 (patch)
tree5443ceec2567a4df01adf5bfd7195efb14bbfef5 /src/libwalletqt/TransactionHistory.cpp
parent3d7ded209a4f3c56dc60dc4ebcc41db1f9cb98a2 (diff)
parent9d5eb002ae5a2308acc1f5a6f2c37bec12fce06f (diff)
downloadmonzero-gui-fd9e7d00edcf7e8a37d9078c64a4d938e75da0b0.tar.gz
monzero-gui-fd9e7d00edcf7e8a37d9078c64a4d938e75da0b0.tar.xz
monzero-gui-fd9e7d00edcf7e8a37d9078c64a4d938e75da0b0.zip
Merge pull request #2553
9d5eb00 TransactionHistory: guard tx info list against concurrent access (xiphon)
Diffstat (limited to 'src/libwalletqt/TransactionHistory.cpp')
-rw-r--r--src/libwalletqt/TransactionHistory.cpp74
1 files changed, 43 insertions, 31 deletions
diff --git a/src/libwalletqt/TransactionHistory.cpp b/src/libwalletqt/TransactionHistory.cpp
index e6cfa44e..889bd7c4 100644
--- a/src/libwalletqt/TransactionHistory.cpp
+++ b/src/libwalletqt/TransactionHistory.cpp
@@ -32,10 +32,13 @@
#include <QFile>
#include <QDebug>
+#include <QReadLocker>
+#include <QWriteLocker>
TransactionInfo *TransactionHistory::transaction(int index)
{
+ QReadLocker locker(&m_tinfoLock);
if (index < 0 || index >= m_tinfo.size()) {
qCritical("%s: no transaction info for index %d", __FUNCTION__, index);
@@ -53,41 +56,48 @@ TransactionInfo *TransactionHistory::transaction(int index)
QList<TransactionInfo *> TransactionHistory::getAll(quint32 accountIndex) const
{
- // XXX this invalidates previously saved history that might be used by model
- emit refreshStarted();
- qDeleteAll(m_tinfo);
- m_tinfo.clear();
-
QDateTime firstDateTime = QDateTime(QDate(2014, 4, 18)); // the genesis block
QDateTime lastDateTime = QDateTime::currentDateTime().addDays(1); // tomorrow (guard against jitter and timezones)
- quint64 lastTxHeight = 0;
- m_locked = false;
- m_minutesToUnlock = 0;
- TransactionHistory * parent = const_cast<TransactionHistory*>(this);
- for (const auto i : m_pimpl->getAll()) {
- TransactionInfo * ti = new TransactionInfo(i, parent);
- if (ti->subaddrAccount() != accountIndex) {
- delete ti;
- continue;
- }
- m_tinfo.append(ti);
- // looking for transactions timestamp scope
- if (ti->timestamp() >= lastDateTime) {
- lastDateTime = ti->timestamp();
- }
- if (ti->timestamp() <= firstDateTime) {
- firstDateTime = ti->timestamp();
- }
- quint64 requiredConfirmations = (ti->blockHeight() < ti->unlockTime()) ? ti->unlockTime() - ti->blockHeight() : 10;
- // store last tx height
- if (ti->confirmations() < requiredConfirmations && ti->blockHeight() >= lastTxHeight) {
- lastTxHeight = ti->blockHeight();
- // TODO: Fetch block time and confirmations needed from wallet2?
- m_minutesToUnlock = (requiredConfirmations - ti->confirmations()) * 2;
- m_locked = true;
- }
+ emit refreshStarted();
+
+ {
+ QWriteLocker locker(&m_tinfoLock);
+
+ // XXX this invalidates previously saved history that might be used by model
+ qDeleteAll(m_tinfo);
+ m_tinfo.clear();
+
+ quint64 lastTxHeight = 0;
+ m_locked = false;
+ m_minutesToUnlock = 0;
+ TransactionHistory * parent = const_cast<TransactionHistory*>(this);
+ for (const auto i : m_pimpl->getAll()) {
+ TransactionInfo * ti = new TransactionInfo(i, parent);
+ if (ti->subaddrAccount() != accountIndex) {
+ delete ti;
+ continue;
+ }
+ m_tinfo.append(ti);
+ // looking for transactions timestamp scope
+ if (ti->timestamp() >= lastDateTime) {
+ lastDateTime = ti->timestamp();
+ }
+ if (ti->timestamp() <= firstDateTime) {
+ firstDateTime = ti->timestamp();
+ }
+ quint64 requiredConfirmations = (ti->blockHeight() < ti->unlockTime()) ? ti->unlockTime() - ti->blockHeight() : 10;
+ // store last tx height
+ if (ti->confirmations() < requiredConfirmations && ti->blockHeight() >= lastTxHeight) {
+ lastTxHeight = ti->blockHeight();
+ // TODO: Fetch block time and confirmations needed from wallet2?
+ m_minutesToUnlock = (requiredConfirmations - ti->confirmations()) * 2;
+ m_locked = true;
+ }
+
+ }
}
+
emit refreshFinished();
if (m_firstDateTime != firstDateTime) {
@@ -112,6 +122,8 @@ void TransactionHistory::refresh(quint32 accountIndex)
quint64 TransactionHistory::count() const
{
+ QReadLocker locker(&m_tinfoLock);
+
return m_tinfo.count();
}