libwallet_api: TransactionHistory: read/write syncchronization

This commit is contained in:
Ilya Kitaev 2016-10-06 23:25:43 +03:00
parent 559f379327
commit 11fab41c36
2 changed files with 21 additions and 14 deletions

View file

@ -60,12 +60,24 @@ TransactionHistoryImpl::~TransactionHistoryImpl()
int TransactionHistoryImpl::count() const int TransactionHistoryImpl::count() const
{ {
boost::lock_guard<boost::mutex> guarg(m_historyMutex); boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
return m_history.size(); 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 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(), auto itr = std::find_if(m_history.begin(), m_history.end(),
[&](const TransactionInfo * ti) { [&](const TransactionInfo * ti) {
return ti->hash() == id; return ti->hash() == id;
@ -75,13 +87,16 @@ TransactionInfo *TransactionHistoryImpl::transaction(const std::string &id) cons
std::vector<TransactionInfo *> TransactionHistoryImpl::getAll() const std::vector<TransactionInfo *> TransactionHistoryImpl::getAll() const
{ {
boost::shared_lock<boost::shared_mutex> lock(m_historyMutex);
return m_history; return m_history;
} }
void TransactionHistoryImpl::refresh() void TransactionHistoryImpl::refresh()
{ {
// multithreaded access: // 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; // TODO: configurable values;
uint64_t min_height = 0; uint64_t min_height = 0;
@ -190,16 +205,8 @@ void TransactionHistoryImpl::refresh()
ti->m_timestamp = pd.m_timestamp; ti->m_timestamp = pd.m_timestamp;
m_history.push_back(ti); 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;
}
} }

View file

@ -29,7 +29,7 @@
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
#include "wallet/wallet2_api.h" #include "wallet/wallet2_api.h"
#include <boost/thread/mutex.hpp> #include <boost/thread/shared_mutex.hpp>
namespace Bitmonero { namespace Bitmonero {
@ -52,7 +52,7 @@ private:
// TransactionHistory is responsible of memory management // TransactionHistory is responsible of memory management
std::vector<TransactionInfo*> m_history; std::vector<TransactionInfo*> m_history;
WalletImpl *m_wallet; WalletImpl *m_wallet;
mutable boost::mutex m_historyMutex; mutable boost::shared_mutex m_historyMutex;
}; };
} }