diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 0001f787b..37e2d0cc3 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -70,6 +70,7 @@ std::map const& genesisState(); /** * @brief Implements the blockchain database. All data this gives is disk-backed. + * @todo Make thread-safe. */ class BlockChain { diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index ba6cac3c7..ea09a63c0 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -143,7 +143,7 @@ void Client::stopMining() void Client::transact(Secret _secret, u256 _value, Address _dest, bytes const& _data, u256 _gas, u256 _gasPrice) { - lock_guard l(m_lock); + ClientGuard l(this); Transaction t; t.nonce = m_postMine.transactionsFrom(toAddress(_secret)); t.value = _value; @@ -158,7 +158,7 @@ void Client::transact(Secret _secret, u256 _value, Address _dest, bytes const& _ Address Client::transact(Secret _secret, u256 _endowment, bytes const& _init, u256 _gas, u256 _gasPrice) { - lock_guard l(m_lock); + ClientGuard l(this); Transaction t; t.nonce = m_postMine.transactionsFrom(toAddress(_secret)); t.value = _endowment; @@ -174,7 +174,7 @@ Address Client::transact(Secret _secret, u256 _endowment, bytes const& _init, u2 void Client::inject(bytesConstRef _rlp) { - lock_guard l(m_lock); + ClientGuard l(this); m_tq.attemptImport(_rlp); m_changed = true; } @@ -188,9 +188,9 @@ void Client::work() // Will broadcast any of our (new) transactions and blocks, and collect & add any of their (new) transactions and blocks. if (m_net) { - m_net->process(); + ClientGuard l(this); + m_net->process(); // must be in guard for now since it uses the blockchain. TODO: make BlockChain thread-safe. - lock_guard l(m_lock); if (m_net->sync(m_bc, m_tq, m_stateDB)) changed = true; } @@ -203,7 +203,7 @@ void Client::work() // all blocks. // Resynchronise state with block chain & trans { - lock_guard l(m_lock); + ClientGuard l(this); if (m_preMine.sync(m_bc) || m_postMine.address() != m_preMine.address()) { if (m_doMine) @@ -227,7 +227,7 @@ void Client::work() m_mineProgress.best = (double)-1; m_mineProgress.hashes = 0; m_mineProgress.ms = 0; - lock_guard l(m_lock); + ClientGuard l(this); if (m_paranoia) { if (m_postMine.amIJustParanoid(m_bc)) @@ -259,14 +259,14 @@ void Client::work() m_mineProgress.ms += 100; m_mineProgress.hashes += mineInfo.hashes; { - lock_guard l(m_lock); + ClientGuard l(this); m_mineHistory.push_back(mineInfo); } if (mineInfo.completed) { // Import block. - lock_guard l(m_lock); + ClientGuard l(this); m_postMine.completeMine(); m_bc.attemptImport(m_postMine.blockData(), m_stateDB); m_changed = true; @@ -295,7 +295,7 @@ unsigned Client::numberOf(int _n) const else if (_n == GenesisBlock) return 0; else - return m_bc.details().number + 1 + _n; + return m_bc.details().number + max(-m_bc.details().number, 1 + _n); } State Client::asOf(int _h) const