Skip to content

Commit

Permalink
use single execution context per thread, not per contract
Browse files Browse the repository at this point in the history
  • Loading branch information
linh2931 committed Aug 4, 2023
1 parent 214d4a8 commit 4944f3e
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
2 changes: 2 additions & 0 deletions libraries/chain/include/eosio/chain/webassembly/eos-vm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct profile_config {

template<typename Backend>
class eos_vm_runtime : public eosio::chain::wasm_runtime_interface {
using context_t = typename Backend::template context<eos_vm_host_functions_t>;
public:
eos_vm_runtime();
std::unique_ptr<wasm_instantiated_module_interface> instantiate_module(const char* code_bytes, size_t code_size,
Expand All @@ -49,6 +50,7 @@ class eos_vm_runtime : public eosio::chain::wasm_runtime_interface {
private:
// todo: managing this will get more complicated with sync calls;
eos_vm_backend_t<Backend>* _bkend = nullptr; // non owning pointer to allow for immediate exit
context_t _exec_ctx;

template<typename Impl>
friend class eos_vm_instantiated_module;
Expand Down
10 changes: 8 additions & 2 deletions libraries/chain/webassembly/runtimes/eos-vm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,12 @@ class eos_vm_instantiated_module : public wasm_instantiated_module_interface {
_instantiated_module(std::move(mod)) {}

void apply(apply_context& context) override {
// Reset execution context (reused per thread)
_runtime->_exec_ctx.set_module(&(_instantiated_module->get_module()));
_instantiated_module->set_context(&_runtime->_exec_ctx);
_instantiated_module->reset_max_call_depth();
_instantiated_module->reset_max_pages();

_instantiated_module->set_wasm_allocator(&context.control.get_wasm_allocator());
_runtime->_bkend = _instantiated_module.get();
apply_options opts;
Expand Down Expand Up @@ -240,9 +246,9 @@ std::unique_ptr<wasm_instantiated_module_interface> eos_vm_runtime<Impl>::instan
.max_call_depth = 0 };
std::unique_ptr<backend_t> bkend = nullptr;
if constexpr (std::is_same_v<Impl, eosio::vm::jit>) {
bkend = std::make_unique<backend_t>(code, code_size, nullptr, options, true); // true -- JIT uses single parsing
bkend = std::make_unique<backend_t>(code, code_size, nullptr, options, true, false); // true, false <--> single parsing, backend does not own execution context (execution context is reused per thread)
} else {
bkend = std::make_unique<backend_t>(code, code_size, nullptr, options, false); // false -- Interpreter uses 2-passes parsing
bkend = std::make_unique<backend_t>(code, code_size, nullptr, options, false, false); // false, false <--> 2-passes parsing, backend does not own execution context (execution context is reused per thread)
}
eos_vm_host_functions_t::resolve(bkend->get_module());
return std::make_unique<eos_vm_instantiated_module<Impl>>(this, std::move(bkend));
Expand Down

0 comments on commit 4944f3e

Please sign in to comment.