Browse Source

Merge pull request #2614 from chfast/fix_vmtrace

Fix VM tracing
cl-refactor
Gav Wood 10 years ago
parent
commit
82e950f171
  1. 3
      libethereum/Executive.cpp
  2. 27
      libethereum/State.cpp
  3. 16
      libp2p/RLPXSocketIO.cpp

3
libethereum/Executive.cpp

@ -325,7 +325,8 @@ bool Executive::go(OnOpFunc const& _onOp)
#endif #endif
try try
{ {
auto vm = VMFactory::create(); // Create VM instance. Force Interpreter if tracing requested.
auto vm = _onOp ? VMFactory::create(VMKind::Interpreter) : VMFactory::create();
if (m_isCreation) if (m_isCreation)
{ {
auto out = vm->exec(m_gas, *m_ext, _onOp); auto out = vm->exec(m_gas, *m_ext, _onOp);

27
libethereum/State.cpp

@ -1137,6 +1137,12 @@ bool State::isTrieGood(bool _enforceRefs, bool _requireNoLeftOvers) const
ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp) ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp)
{ {
auto onOp = _onOp;
#if ETH_VMTRACE
if (isChannelVisible<VMTraceChannel>())
onOp = Executive::simpleTrace(); // override tracer
#endif
#if ETH_PARANOIA #if ETH_PARANOIA
paranoia("start of execution.", true); paranoia("start of execution.", true);
State old(*this); State old(*this);
@ -1161,16 +1167,7 @@ ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Per
ctrace << toHex(e.t().rlp()); ctrace << toHex(e.t().rlp());
#endif #endif
if (!e.execute()) if (!e.execute())
#if ETH_VMTRACE e.go(onOp);
{
if (isChannelVisible<VMTraceChannel>())
e.go(e.simpleTrace());
else
e.go(_onOp);
}
#else
e.go(_onOp);
#endif
e.finalize(); e.finalize();
#if ETH_PARANOIA #if ETH_PARANOIA
@ -1183,13 +1180,13 @@ ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Per
else else
{ {
commit(); commit();
#if ETH_PARANOIA && !ETH_FATDB #if ETH_PARANOIA && !ETH_FATDB
ctrace << "Executed; now" << rootHash(); ctrace << "Executed; now" << rootHash();
ctrace << old.diff(*this); ctrace << old.diff(*this);
paranoia("after execution commit.", true); paranoia("after execution commit.", true);
if (e.t().receiveAddress()) if (e.t().receiveAddress())
{ {
EnforceRefs r(m_db, true); EnforceRefs r(m_db, true);
@ -1200,9 +1197,9 @@ ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Per
} }
} }
#endif #endif
// TODO: CHECK TRIE after level DB flush to make sure exactly the same. // TODO: CHECK TRIE after level DB flush to make sure exactly the same.
// Add to the user-originated transactions that we've executed. // Add to the user-originated transactions that we've executed.
m_transactions.push_back(e.t()); m_transactions.push_back(e.t());
m_receipts.push_back(TransactionReceipt(rootHash(), startGasUsed + e.gasUsed(), e.logs())); m_receipts.push_back(TransactionReceipt(rootHash(), startGasUsed + e.gasUsed(), e.logs()));

16
libp2p/RLPXSocketIO.cpp

@ -1,16 +1,16 @@
/* /*
This file is part of cpp-ethereum. This file is part of cpp-ethereum.
cpp-ethereum is free software: you can redistribute it and/or modify cpp-ethereum is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
cpp-ethereum is distributed in the hope that it will be useful, cpp-ethereum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>. along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -34,7 +34,7 @@ RLPXSocketIO::RLPXSocketIO(unsigned _protCount, RLPXFrameCoder& _coder, bi::tcp:
m_flowControl(_flowControl), m_flowControl(_flowControl),
m_coder(_coder), m_coder(_coder),
m_socket(_socket), m_socket(_socket),
m_writers(move(writers(_protCount))), m_writers(writers(_protCount)),
m_egressCapacity(m_flowControl ? _initialCapacity : MaxPacketSize * m_writers.size()) m_egressCapacity(m_flowControl ? _initialCapacity : MaxPacketSize * m_writers.size())
{} {}
@ -61,11 +61,11 @@ void RLPXSocketIO::send(unsigned _protocolType, unsigned _type, RLPStream& _payl
void RLPXSocketIO::doWrite() void RLPXSocketIO::doWrite()
{ {
m_toSend.clear(); m_toSend.clear();
size_t capacity; size_t capacity;
DEV_GUARDED(x_queued) DEV_GUARDED(x_queued)
capacity = min(m_egressCapacity, MaxPacketSize); capacity = min(m_egressCapacity, MaxPacketSize);
size_t active = 0; size_t active = 0;
for (auto const& w: m_writers) for (auto const& w: m_writers)
if (w.size()) if (w.size())
@ -97,7 +97,7 @@ void RLPXSocketIO::write(size_t _dequed)
{ {
if (ec) if (ec)
return; // TCPSocketWriteError return; // TCPSocketWriteError
bool reschedule = false; bool reschedule = false;
DEV_GUARDED(x_queued) DEV_GUARDED(x_queued)
{ {
@ -109,4 +109,4 @@ void RLPXSocketIO::write(size_t _dequed)
if (reschedule) if (reschedule)
doWrite(); doWrite();
}); });
} }

Loading…
Cancel
Save