Browse Source

Merge pull request #78 from zelig/develop

std::unordered_map for blockdetail hash
cl-refactor
Gav Wood 11 years ago
parent
commit
5fb48863f8
  1. 4
      libethereum/BlockChain.cpp
  2. 4
      libethereum/BlockChain.h
  3. 37
      libethereum/Common.h
  4. 2
      libethereum/State.h
  5. 16
      libethereum/VM.h

4
libethereum/BlockChain.cpp

@ -271,7 +271,7 @@ bytesConstRef BlockChain::block(h256 _hash) const
BlockDetails const& BlockChain::details(h256 _h) const
{
std::map<h256, BlockDetails>::const_iterator it;
BlockDetailsHash::const_iterator it;
bool fetchRequired;
{
lock_guard<mutex> l(m_lock);
@ -290,7 +290,7 @@ BlockDetails const& BlockChain::details(h256 _h) const
{
lock_guard<mutex> l(m_lock);
bool ok;
tie(it, ok) = m_details.insert(make_pair(_h, BlockDetails(RLP(s))));
tie(it, ok) = m_details.insert(std::make_pair(_h, BlockDetails(RLP(s))));
}
}
return it->second;

4
libethereum/BlockChain.h

@ -48,6 +48,8 @@ struct BlockDetails
h256s children;
};
typedef std::unordered_map<h256, BlockDetails, H256Hash> BlockDetailsHash;
static const BlockDetails NullBlockDetails;
static const h256s NullH256s;
@ -101,7 +103,7 @@ private:
void checkConsistency();
/// Get fully populated from disk DB.
mutable std::map<h256, BlockDetails> m_details;
mutable BlockDetailsHash m_details;
mutable std::map<h256, std::string> m_cache;
mutable std::mutex m_lock;

37
libethereum/Common.h

@ -181,6 +181,43 @@ using HexMap = std::map<bytes, std::string>;
static const u256 Invalid256 = ~(u256)0;
static const bytes NullBytes;
// This is the helper class for the std::unordered_map lookup; it converts the input 256bit hash into a size_t sized hash value
// and does an exact comparison of two hash entries.
class H256Hash
{
public:
static const size_t bucket_size = 4;
static const size_t min_buckets = 8;
// Compute the size_t hash of this hash
size_t operator()(const h256 &index) const
{
const uint64_t *data = (const uint64_t *)index.data();
uint64_t hash = data[0];
hash ^= data[1];
hash ^= data[2];
hash ^= data[3];
return (size_t)hash;
}
// Return true if hash s1 is less than hash s2
bool operator()(const h256 &s1, const h256 &s2) const
{
const uint64_t *hash1 = (const uint64_t *)s1.data();
const uint64_t *hash2 = (const uint64_t *)s2.data();
if (hash1[0] < hash2[0]) return true;
if (hash1[0] > hash2[0]) return false;
if (hash1[1] < hash2[1]) return true;
if (hash1[1] > hash2[1]) return false;
if (hash1[2] < hash2[2]) return true;
if (hash1[2] > hash2[2]) return false;
return hash1[3] < hash2[3];
}
};
/// Logging
class NullOutputStream

2
libethereum/State.h

@ -266,7 +266,7 @@ public:
#ifdef __clang__
auto it = m_store->find(_n);
if (it == m_store->end())
m_store->insert(make_pair(_n, _v));
m_store->insert(std::make_pair(_n, _v));
else
m_store->at(_n) = _v;
#else

16
libethereum/VM.h

@ -482,11 +482,11 @@ template <class Ext> void eth::VM::go(Ext& _ext, uint64_t _steps)
{
require(1);
#ifdef __clang__
auto mFinder = tempMem.find(stack.back());
if (mFinder != tempMem.end())
stack.back() = mFinder->second;
auto mFinder = m_temp.find(m_stack.back());
if (mFinder != m_temp.end())
m_stack.back() = mFinder->second;
else
stack.back() = 0;
m_stack.back() = 0;
#else
m_stack.back() = m_temp[m_stack.back()];
#endif
@ -496,11 +496,11 @@ template <class Ext> void eth::VM::go(Ext& _ext, uint64_t _steps)
{
require(2);
#ifdef __clang__
auto mFinder = tempMem.find(stack.back());
if (mFinder == tempMem.end())
tempMem.insert(make_pair(stack.back(), stack[stack.size() - 2]));
auto mFinder = m_temp.find(m_stack.back());
if (mFinder == m_temp.end())
m_temp.insert(std::make_pair(m_stack.back(), m_stack[m_stack.size() - 2]));
else
mFinder->second = stack[stack.size() - 2];
mFinder->second = m_stack[m_stack.size() - 2];
#else
m_temp[m_stack.back()] = m_stack[m_stack.size() - 2];
#endif

Loading…
Cancel
Save