aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Kitaev <mbg033@gmail.com>2016-10-06 23:25:43 +0300
committerIlya Kitaev <mbg033@gmail.com>2016-10-06 23:25:43 +0300
commit11fab41c3638e9368c5589c4092af0b0e29ff054 (patch)
treef5b499ea1da16069ed03349b5f47ff725514bf8c
parentlibwallet_api: test: adjusted mixin_count=4 as it's minumum allowed (diff)
downloadmonero-11fab41c3638e9368c5589c4092af0b0e29ff054.tar.xz
libwallet_api: TransactionHistory: read/write syncchronization
-rw-r--r--src/wallet/api/transaction_history.cpp31
-rw-r--r--src/wallet/api/transaction_history.h4
2 files changed, 21 insertions, 14 deletions
diff --git a/src/wallet/api/transaction_history.cpp b/src/wallet/api/transaction_history.cpp
index 5f99750d5..df495591f 100644
--- a/src/wallet/api/transaction_history.cpp
+++ b/src/wallet/api/transaction_history.cpp
@@ -60,12 +60,24 @@ TransactionHistoryImpl::~TransactionHistoryImpl()
int TransactionHistoryImpl::count() const
{
- boost::lock_guard<boost::mutex> guarg(m_historyMutex);
- return m_history.size();
+ boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
+ int result = m_history.size();
+ return result;
+}
+
+TransactionInfo *TransactionHistoryImpl::transaction(int index) const
+{
+ boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
+ // sanity check
+ if (index < 0)
+ return nullptr;
+ unsigned index_ = static_cast<unsigned>(index);
+ return index_ < m_history.size() ? m_history[index_] : nullptr;
}
TransactionInfo *TransactionHistoryImpl::transaction(const std::string &id) const
{
+ boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
auto itr = std::find_if(m_history.begin(), m_history.end(),
[&](const TransactionInfo * ti) {
return ti->hash() == id;
@@ -75,13 +87,16 @@ TransactionInfo *TransactionHistoryImpl::transaction(const std::string &id) cons
std::vector<TransactionInfo *> TransactionHistoryImpl::getAll() const
{
+ boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
return m_history;
}
void TransactionHistoryImpl::refresh()
{
// multithreaded access:
- boost::lock_guard<boost::mutex> guarg(m_historyMutex);
+ // boost::lock_guard<boost::mutex> guarg(m_historyMutex);
+ // for "write" access, locking exclusively
+ boost::unique_lock<boost::shared_mutex> lock(m_historyMutex);
// TODO: configurable values;
uint64_t min_height = 0;
@@ -190,16 +205,8 @@ void TransactionHistoryImpl::refresh()
ti->m_timestamp = pd.m_timestamp;
m_history.push_back(ti);
}
-
}
-TransactionInfo *TransactionHistoryImpl::transaction(int index) const
-{
- // sanity check
- if (index < 0)
- return nullptr;
- unsigned index_ = static_cast<unsigned>(index);
- return index_ < m_history.size() ? m_history[index_] : nullptr;
-}
+
}
diff --git a/src/wallet/api/transaction_history.h b/src/wallet/api/transaction_history.h
index 04db7e8e1..1b6617ead 100644
--- a/src/wallet/api/transaction_history.h
+++ b/src/wallet/api/transaction_history.h
@@ -29,7 +29,7 @@
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include "wallet/wallet2_api.h"
-#include <boost/thread/mutex.hpp>
+#include <boost/thread/shared_mutex.hpp>
namespace Bitmonero {
@@ -52,7 +52,7 @@ private:
// TransactionHistory is responsible of memory management
std::vector<TransactionInfo*> m_history;
WalletImpl *m_wallet;
- mutable boost::mutex m_historyMutex;
+ mutable boost::shared_mutex m_historyMutex;
};
}