diff options
| author | luigi1111 <luigi1111w@gmail.com> | 2019-12-05 08:49:14 -0600 |
|---|---|---|
| committer | luigi1111 <luigi1111w@gmail.com> | 2019-12-05 08:49:14 -0600 |
| commit | fd9e7d00edcf7e8a37d9078c64a4d938e75da0b0 (patch) | |
| tree | 5443ceec2567a4df01adf5bfd7195efb14bbfef5 /src/libwalletqt/TransactionHistory.cpp | |
| parent | 3d7ded209a4f3c56dc60dc4ebcc41db1f9cb98a2 (diff) | |
| parent | 9d5eb002ae5a2308acc1f5a6f2c37bec12fce06f (diff) | |
| download | monzero-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.cpp | 74 |
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(); } |
